ฉันได้รับข้อผิดพลาดนี้ 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 ซึ่งใช้ฟังก์ชันที่หลากหลายและฟังก์ชันแบบเรียงซ้อน ฉันไม่สามารถแสดงกรณีที่ทำซ้ำได้ทั้งหมดที่นี่ และหวังว่าจะสามารถตอบได้ด้วยประสบการณ์หรือตัวอย่างที่ง่ายกว่า