Score:1

เมื่อเขียน csv จาก CF ไปยังที่ฝากข้อมูล: 'ด้วย open(filepath, "w") เป็น MY_CSV:' นำไปสู่ ​​"FileNotFoundError: [Errno 2] No such file or directory:"

ฉันได้รับข้อผิดพลาดนี้ FileNotFoundError: [Errno 2] ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว เมื่อฉันพยายามเขียนไฟล์ csv ลงในบัคเก็ต โดยใช้ตัวเขียน csv ที่วนซ้ำชุดข้อมูล ข้อมูลเชิงลึกทั้งหมดเกี่ยวกับ Cloud Function จะบันทึกข้อผิดพลาดนั้น:


ไฟล์ "/workspace/main.py" บรรทัดที่ 299 ใน write_to_csv_file ด้วย
เปิด (เส้นทางไฟล์, "w") เป็น outcsv: FileNotFoundError: [Errno 2] ไม่เช่นนั้น
ไฟล์หรือไดเรกทอรี: 'gs://MY_BUCKET/MY_CSV.csv'

การดำเนินการของฟังก์ชันใช้เวลา 52,655 มิลลิวินาที เสร็จสิ้นด้วยสถานะ: 'ผิดพลาด' 

คำเตือน OpenBLAS - ไม่สามารถกำหนดขนาดแคช L2 ได้
ระบบ สมมติว่า 256k ```

และแม้ว่า bucket_filepath นี้มีอยู่จริง: ฉันสามารถอัปโหลดไฟล์จำลองเปล่าและรับ "gsutils URI" (คลิกขวาที่จุดสามจุดที่ด้านขวาของไฟล์) และ bucket_filepath จะมีลักษณะเหมือนกัน: 'gs://MY_BUCKET/MY_CSV.csv'.

ฉันตรวจสอบการบันทึกดาต้าเฟรมดัมมี่แพนด้าแทนการใช้ pd.to_csv และใช้งานได้กับ bucket_filepath (!) เดียวกัน

ดังนั้นจึงต้องมีเหตุผลอื่น เป็นไปได้ว่านักเขียนจะไม่ได้รับการยอมรับ หรือ พร้อมคำชี้แจง ที่เปิดไฟล์.

รหัสที่พ่นข้อผิดพลาดมีดังนี้ เป็นรหัสเดียวกันที่ทำงานนอก Google Cloud Function ในงาน cron ปกติบนเซิร์ฟเวอร์ภายในเครื่อง ฉันได้เพิ่มการพิมพ์ดีบั๊กสองครั้งรอบบรรทัดที่แสดงข้อผิดพลาด พิมพ์ ("ทันทีหลังจากเปิดไฟล์ ... ") ไม่ปรากฏขึ้นอีกต่อไป ฟังก์ชันย่อย query_execute_batch() นั่น ไรท์_to_csv_file() กำลังเรียกใช้สำหรับแต่ละแบทช์ก็ปรากฏขึ้นเช่นกัน แต่น่าจะไม่ใช่ปัญหาที่นี่ เนื่องจากข้อผิดพลาดเกิดขึ้นตั้งแต่เริ่มต้นเมื่อเขียน-เปิดไฟล์ csv

ข้อกำหนด. txt (ซึ่งจะถูกนำเข้าเป็นโมดูล):

SQLAlchemy>=1.4.2
google-cloud-storage>=1.16.1
mysqlclient==2.1.0
หมีแพนด้า==1.2.3
fsspec==2021.11.1
gcsfs==2021.11.1
ยูนิโคเดคส์v==0.14.1

และจาก main.py:

def query_execute_batch (การเชื่อมต่อ):
    """ฟังก์ชันสำหรับอ่านข้อมูลจากผลการสืบค้นเป็นชุด
    :yield: แต่ละผลลัพธ์ในลูปคือชุดของผลลัพธ์การสืบค้น
    """
    ผลลัพธ์ = execute_select_batch (การเชื่อมต่อ, SQL_QUERY)
    พิมพ์ (f"len (ผลลัพธ์): {len (ผลลัพธ์)}")
    สำหรับผลลัพธ์:
        ให้ผล

def write_to_csv_file (การเชื่อมต่อ เส้นทางไฟล์):
    """เขียนข้อมูลวนซ้ำเป็นชุดเป็น csv
    สิ่งนี้จะทำเป็นชุดเนื่องจากการสืบค้นจากฐานข้อมูลมีขนาดใหญ่มาก
    : การเชื่อมต่อพารามิเตอร์: การเชื่อมต่อ mysqldb กับฐานข้อมูล
    :param filepath: เส้นทางไปยังไฟล์ csv เพื่อเขียนข้อมูล
    ส่งกลับ: ข้อมูลเมตาในแถวและเวลา
    """
    เคาน์เตอร์ = 0
    พิมพ์ ("ก่อนเปิดไฟล์ ... ")    
    ด้วย open(filepath, "w") เป็น outcsv:
        พิมพ์ ("ทันทีหลังจากเปิดไฟล์ ... ")        
        นักเขียน = csv.DictWriter(
            เอาท์ซี,
            ชื่อฟิลด์ = FIELDNAMES,
            extrasaction="เพิกเฉย",
            ตัวคั่น = "|",
            lineterminator="\n",
        )
        # เขียนส่วนหัวตามชื่อฟิลด์
        นักเขียน.หัวเรื่อง()

        สำหรับแบทช์ในquery_execute_batch(การเชื่อมต่อ):
            writer.writerows (แบทช์)
            counterrows += เลน (แบทช์)
        datetime_now_save = datetime.now()
    ส่งคืน counterrows, datetime_now_save

โปรดทราบว่าเพื่อให้สคริปต์ด้านบนใช้งานได้ ฉันนำเข้า gcsf ซึ่งทำให้บัคเก็ตอ่าน-เขียนได้ มิฉะนั้นฉันอาจต้องการวัตถุที่เก็บข้อมูลบนคลาวด์ของ Google เช่น:

storage_client = storage.Client()
ถัง = storage_client.bucket(BUCKET_NAME)

แล้วสร้างไฟล์ในบัคเก็ตนั้นด้วยฟังก์ชันเพิ่มเติม แต่นั่นไม่ใช่จุดมุ่งหมายที่นี่

ในต่อไปนี้, the pd.to_csv รหัสที่ใช้งานได้จะใช้ผลลัพธ์ของแบบสอบถาม SQL จำลอง เลือก 1 เป็นอินพุตของดาต้าเฟรม นี้ สามารถ ถูกบันทึกไว้ใน bucket_filepath เดียวกัน แน่นอนว่าเหตุผลอาจไม่ใช่แค่นั้น pd.to_csv() เช่นนี้ แต่ยังรวมถึงชุดข้อมูลที่เป็นหุ่นแทนสตริง Unicode ที่ซับซ้อนจากขนาดใหญ่ เลือกแบบสอบถาม. หรือมีเหตุผลอื่น ฉันแค่คาดเดา

ถ้าระเบียนไม่มี:
    df = pd.DataFrame(บันทึก.fetchall())
    df.columns = ระเบียน คีย์ ()
    df.to_csv(พาธของไฟล์
        ดัชนี = เท็จ
    )
    datetime_now_save = datetime.now()
    เคาน์เตอร์ = df.shape[0]

ฉันต้องการใช้ตัวเขียน csv เพื่อให้มีโอกาสเขียน Unicode ด้วยโมดูล Unicodecsv และโอกาสในการใช้แบทช์

ฉันอาจยินดีที่จะเปลี่ยนเป็นแบทช์ (วนซ้ำ + ต่อท้าย โหมดหรือ ขนาดก้อน) ในหมีแพนด้าเช่นใน การเขียน Pandas Dataframes ขนาดใหญ่ไปยังไฟล์ CSV เป็นชิ้นๆ เพื่อกำจัดปัญหาเส้นทางไฟล์ที่ฝากข้อมูลนี้ แต่ฉันต้องการใช้รหัสพร้อม (อย่าแตะต้องระบบที่กำลังทำงานอยู่)

ฉันจะบันทึก csv นั้นด้วยตัวเขียน csv ได้อย่างไรเพื่อให้สามารถเปิดไฟล์ใหม่ในที่ฝากข้อมูล เขียน โหมด = ด้วย open(filepath, "w") เป็น outcsv:?

ฟังก์ชันที่กำหนด ไรท์_to_csv_file() เป็นเพียงส่วนเล็กๆ ของ Cloud Function ซึ่งใช้ฟังก์ชันที่หลากหลายและฟังก์ชันแบบเรียงซ้อน ฉันไม่สามารถแสดงกรณีที่ทำซ้ำได้ทั้งหมดที่นี่ และหวังว่าจะสามารถตอบได้ด้วยประสบการณ์หรือตัวอย่างที่ง่ายกว่า

Score:1

วิธีแก้ปัญหานั้นน่าประหลาดใจ คุณ ต้อง นำเข้าและใช้ gcsf โมดูลถ้าคุณต้องการเขียนไฟล์ด้วย เปิด().

ถ้าคุณใช้ pd.to_csv(), นำเข้า gcsfs ไม่จำเป็น แต่ gcsf ยังคงมีความจำเป็นใน ข้อกำหนด. txt เพื่อทำ pd.to_csv() งานดังนั้นแพนด้า to_csv() ดูเหมือนว่าจะใช้โดยอัตโนมัติ

เดอะ pd.to_csv() วางความประหลาดใจนี่คือรหัสที่ตอบคำถาม (ทดสอบ):

def write_to_csv_file (การเชื่อมต่อ เส้นทางไฟล์):
    """เขียนผลลัพธ์ QUERY ในลูปผ่านแบทช์เป็น csv
    สิ่งนี้จะทำเป็นชุดเนื่องจากการสืบค้นจากฐานข้อมูลมีขนาดใหญ่มาก
    : การเชื่อมต่อพารามิเตอร์: การเชื่อมต่อ mysqldb กับฐานข้อมูล
    :param filepath: เส้นทางไปยังไฟล์ csv เพื่อเขียนข้อมูล
    กลับ: ข้อมูลเมตาในแถวและเวลา
    """
    เคาน์เตอร์ = 0
    พิมพ์ ("ก่อนเปิดไฟล์ ... ")
   

    # จำเป็นต้องมีวัตถุ gcsfs เพื่อเปิดไฟล์
    # 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
    # หมายเหตุด้านข้าง (ข้อยกเว้น):
    # pd.to_csv() ไม่ต้องการทั้งวัตถุ gcsfs หรือการนำเข้า
    # มันไม่ได้ใช้ที่นี่ แต่ได้รับการทดสอบด้วยตัวอย่าง
    fs = gcsfs.GCSFileSystem(โครงการ=MY_PROJECT)
    fs.ls(BUCKET_NAME)


    # wb จำเป็น อย่างอื่น "buildins.TypeError: ต้องเป็น str ไม่ใช่ไบต์"
    # https://stackoverflow.com/questions/5512811/builtins-typeerror-must-be-str-not-bytes
    ด้วย fs.open(filepath, 'wb') เป็น outcsv:
        พิมพ์ ("ทันทีหลังจากเปิดไฟล์ ... ")

        นักเขียน = csv.DictWriter(
            เอาท์ซี,
            ชื่อฟิลด์ = FIELDNAMES,
            extrasaction="เพิกเฉย",
            ตัวคั่น = "|",
            lineterminator="\n",
        )
        # เขียนส่วนหัวตามชื่อฟิลด์
        พิมพ์ ("ก่อน writer.writeheader ()")
        นักเขียน.หัวเรื่อง()
        พิมพ์ ("หลังจาก writer.writeheader ()")

        สำหรับแบทช์ในquery_execute_batch(การเชื่อมต่อ):
            writer.writerows (แบทช์)
            counterrows += เลน (แบทช์)
        datetime_now_save = datetime.now()
    ส่งคืน counterrows, datetime_now_save

หมายเหตุด้านข้าง

อย่าใช้ตัวเขียน csv แบบนี้

ใช้เวลานานเกินไปแทนที่จะเป็น pd.to_csv() กับ ขนาดก้อน พารามิเตอร์ 5,000 ซึ่งต้องการเพียง 62 วินาทีสำหรับการโหลดแถว 700k และจัดเก็บเป็น csv ในบัคเก็ต CF ที่มีตัวเขียนแบตช์ใช้เวลามากกว่า 9 นาทีซึ่งเกินขีดจำกัดการหมดเวลา ฉัน จึงบังคับให้ใช้ pd.to_csv() แทนและแปลงข้อมูลของฉันเป็น dataframe สำหรับสิ่งนั้น

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา