tôi nhận được lỗi này FileNotFoundError: [Errno 2] Không có tệp hoặc thư mục như vậy
khi tôi cố gắng ghi tệp csv vào bộ chứa, sử dụng trình ghi csv lặp lại các lô dữ liệu. Thông tin chi tiết đầy đủ về nhật ký Chức năng đám mây xung quanh lỗi đó:
Tệp "/workspace/main.py", dòng 299, trong write_to_csv_file với
open(filepath, "w") dưới dạng outcsv: FileNotFoundError: [Errno 2] Không
tệp hoặc thư mục: 'gs://MY_BUCKET/MY_CSV.csv'
Quá trình thực thi chức năng mất 52655 ms, kết thúc với trạng thái: 'sập'
CẢNH BÁO OpenBLAS - không thể xác định kích thước bộ đệm L2 trên trang này
hệ thống, giả sử 256k ```
Và điều này, mặc dù bucket_filepath này chắc chắn tồn tại: Tôi có thể tải lên một tệp giả trống và nhận "URI gsutils" của nó (nhấp chuột phải vào ba dấu chấm ở bên phải của tệp) và bucket_filepath sẽ trông giống như vậy: 'gs://MY_BUCKET/MY_CSV.csv'
.
Tôi đã kiểm tra việc lưu một khung dữ liệu gấu trúc giả thay vì sử dụng pd.to_csv
và nó hoạt động với cùng một bucket_filepath (!).
Vì vậy, phải có một lý do khác, có thể là người viết không được chấp nhận, hoặc với tuyên bố
mà mở tập tin.
Mã đưa ra lỗi như sau. Đó là cùng một mã hoạt động bên ngoài Google Cloud Function trong một công việc định kỳ bình thường trên máy chủ cục bộ. Tôi đã thêm hai bản in gỡ lỗi xung quanh dòng gây ra lỗi, print("Ngay sau khi mở file...")
không hiện nữa. chức năng con query_execute_batch()
điều đó write_to_csv_file()
đang gọi cho từng lô cũng được hiển thị nhưng có thể không phải là vấn đề ở đây vì lỗi đã xảy ra ngay từ đầu khi ghi-mở tệp csv.
yêu cầu.txt
(sau đó được nhập dưới dạng mô-đun):
SQLAlchemy>=1.4.2
google-cloud-storage>=1.16.1
mysqlclient==2.1.0
gấu trúc==1.2.3
fsspec==2021.11.1
gcsfs==2021.11.1
unicodecsv==0.14.1
Và từ chính.py
:
def query_execute_batch(kết nối):
"""Chức năng đọc dữ liệu từ kết quả truy vấn thành các lô
:yield: mỗi kết quả trong một vòng lặp là một loạt kết quả truy vấn
"""
kết quả = exec_select_batch(kết nối, SQL_QUERY)
print(f"len(kết quả): {len(kết quả)}")
cho kết quả trong kết quả:
mang lại kết quả
def write_to_csv_file(kết nối, đường dẫn tệp):
"""Ghi dữ liệu trong một vòng lặp theo lô vào csv.
Điều này được thực hiện theo đợt vì truy vấn từ cơ sở dữ liệu là rất lớn.
:param kết nối: mysqldb kết nối với DB
:param filepath: đường dẫn đến file csv để ghi dữ liệu
trả về: siêu dữ liệu về hàng và thời gian
"""
số đếm = 0
print("Ngay trước khi mở file...")
với open(filepath, "w") dưới dạng outcsv:
print("Ngay sau khi mở file...")
nhà văn = csv.DictWriter(
outcsv,
tên trường=FIELDNAMES,
bổ sung = "bỏ qua",
dấu phân cách="|",
lineterminator="\n",
)
# viết tiêu đề theo tên trường
nhà văn.writeheader()
cho lô trong query_execute_batch(kết nối):
nhà văn.writerows (đợt)
đếm += len(lô)
datetime_now_save = datetime.now()
trả về số đếm, datetime_now_save
Lưu ý rằng để đoạn script trên hoạt động, tôi nhập gcsfs
làm cho nhóm đọc-ghi-có sẵn. Khác, tôi có thể sẽ cần một đối tượng lưu trữ đám mây của google chẳng hạn như:
storage_client = storage.Client()
xô = storage_client.bucket(BUCKET_NAME)
và sau đó tạo tệp trong nhóm đó với các chức năng khác, nhưng đó không phải là mục đích ở đây.
Sau đây, các pd.to_csv
mã hoạt động, nó sử dụng đầu ra của một truy vấn SQL giả CHỌN 1
làm đầu vào của một khung dữ liệu. Cái này có thể được lưu vào cùng một bucket_filepath, tất nhiên lý do có thể không chỉ là pd.to_csv()
như vậy, nhưng tập dữ liệu cũng là một hình nộm thay vì các chuỗi unicode phức tạp từ một kho dữ liệu khổng lồ CHỌN truy vấn
. Hoặc có một lý do khác, tôi chỉ đoán.
nếu hồ sơ không phải là Không có:
df = pd.DataFrame(records.fetchall())
df.columns = record.keys()
df.to_csv(đường dẫn tệp,
chỉ số = Sai,
)
datetime_now_save = datetime.now()
số đếm = df.shape[0]
Tôi muốn sử dụng trình viết csv để có cơ hội viết bằng unicode với mô-đun unicodecsv và cơ hội sử dụng các lô.
Tôi có thể sẵn sàng thay đổi thành đợt (vòng lặp + nối thêm
chế độ hoặc cỡ khối
) trong gấu trúc như trong Viết các khung dữ liệu Pandas lớn vào tệp CSV theo khối để loại bỏ vấn đề filepath xô này, nhưng tôi muốn sử dụng mã sẵn sàng hơn (không bao giờ chạm vào hệ thống đang chạy).
Làm cách nào tôi có thể thực hiện việc lưu csv đó bằng trình ghi csv để nó có thể mở một tệp mới trong bộ chứa trong viết
chế độ = với open(filepath, "w") dưới dạng outcsv:
?
Hàm đã cho write_to_csv_file()
chỉ là một phần nhỏ của Chức năng đám mây sử dụng nhiều chức năng và chức năng xếp tầng. Tôi không thể trình bày toàn bộ trường hợp có thể lặp lại ở đây và hy vọng rằng nó có thể được trả lời bằng kinh nghiệm hoặc các ví dụ dễ dàng hơn.