Điểm:1

Khi viết csv từ CF vào nhóm: 'với open(filepath, "w") là MY_CSV:' dẫn đến "FileNotFoundError: [Errno 2] Không có tệp hoặc thư mục như vậy:"

lá cờ mx

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.

Điểm:1
lá cờ mx

Giải pháp thật đáng ngạc nhiên. Bạn phải nhập khẩu và sử dụng gcsfs module nếu bạn muốn ghi vào một tập tin với mở().

Nếu bạn dùng pd.to_csv(), nhập gcsfs là không cần thiết, nhưng gcsfs vẫn cần thiết trong yêu cầu.txt để làm cho pd.to_csv() công việc, do đó, gấu trúc to_csv() dường như sử dụng nó tự động.

Các pd.to_csv() đặt sự ngạc nhiên sang một bên, đây là mã trả lời câu hỏi (đã kiểm tra):

def write_to_csv_file(kết nối, đường dẫn tệp):
    """Viết kết quả QUERY trong một vòng lặp qua các 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...")
   

    # Cần có đối tượng gcsfs để mở tệp.
    # https://stackoverflow.com/questions/52805016/how-to-open-a-file-from-google-cloud-storage-into-a-cloud-function
    # https://gcsfs.readthedocs.io/en/latest/index.html#examples
    # Lưu ý bên lề (Ngoại lệ):
    # pd.to_csv() không cần đối tượng gcsfs cũng như quá trình nhập đối tượng.
    # Nó không được sử dụng ở đây, nhưng nó đã được thử nghiệm với các ví dụ.
    fs = gcsfs.GCSFileSystem(project=MY_PROJECT)
    fs.ls(BUCKET_NAME)


    # cần có wb, nếu không thì "nội trang.TypeError: phải là str, không phải byte"
    # https://stackoverflow.com/questions/5512811/builtins-typeerror-must-be-str-not-bytes
    với fs.open(filepath, 'wb') là 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
        print("trước khi viết.writeheader()")
        nhà văn.writeheader()
        print("sau khi 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

ghi chú bên lề

Không sử dụng trình soạn thảo csv như thế này.

Mất quá nhiều thời gian, thay vì pd.to_csv() với một cỡ khối tham số 5000 chỉ cần 62 giây để tải và lưu trữ 700k hàng dưới dạng tệp csv trong nhóm, CF với trình ghi lô mất hơn 9 phút, vượt quá giới hạn thời gian chờ. Tôi là do đó buộc phải sử dụng pd.to_csv() thay vào đó và chuyển đổi dữ liệu của tôi thành khung dữ liệu cho điều đó.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.