จะโหลดรายการที่ซ้อนกันจากไฟล์โดยไม่มีเครื่องหมายคำพูดได้อย่างไร

ฉันควรจะสร้างระบบ "การควบคุมสต็อก" สำหรับผู้ค้าส่งซอฟต์แวร์สำหรับการมอบหมายโมดูล ฉันได้สร้างโปรแกรมแล้ว แต่ฉันประสบปัญหาในการบันทึกสิ่งต่างๆ อย่างถาวร โปรแกรมประกอบด้วยรายการที่ซ้อนกันดังต่อไปนี้:

[["Ms Office", "CD", 7, "Microsoft"], ["Acrobat Reader", "DVD", 12, "Adobe"], ["Norton Antivirus", "DVD", 24, "Symantec"]]

ฉันสามารถบันทึกลงในเอกสารข้อความในรูปแบบได้

['Ms Office', 'CD', 7, 'Microsoft']
['Acrobat Reader', 'DVD', 12, 'Adobe']
['Norton Antivirus', 'DVD', 24, 'Symantec']

แต่เมื่อฉันพยายามโหลดกลับเป็นรายการในรูปแบบเดียวกัน ฉันจะลงเอยด้วยเครื่องหมายคำพูดที่แยกแต่ละรายการดังนี้:

["['Ms Office', 'CD', 7, 'Microsoft']", "['Acrobat Reader', 'DVD', 12, 'Adobe']", "['Norton Antivirus', 'DVD', 24, 'Symantec']"]

ฉันแค่ต้องกำจัดเครื่องหมายคำพูดคู่ที่ล้อมรอบแต่ละรายการในรายการตอนนี้ รหัสที่ฉันใช้โหลดไฟล์นี้:

filename = open('Appexstock.txt', 'r')
contents = filename.read()
thelist = [name for name in contents.split('\n') if name.split('"') if name]
filename.close()

ฉันค้นหาออนไลน์มาหลายชั่วโมงแล้วและลองทุกอย่างแล้ว แต่ยังหาวิธีไม่ได้ผล ฉันเคยเห็นคนจำนวนมากแนะนำโมดูล CSV แต่ฉันไม่รู้ว่าจะนำไปใช้กับโค้ดของฉันได้อย่างไร


person user2802349    schedule 21.09.2013    source แหล่งที่มา


คำตอบ (1)


ใช้ ast.literal_eval:

>>> from ast import literal_eval
with open('Appexstock.txt') as f:
    lis = [literal_eval(line) for line in f]
...     
>>> lis
[['Ms Office', 'CD', 7, 'Microsoft'], ['Acrobat Reader', 'DVD', 12, 'Adobe'], ['Norton Antivirus', 'DVD', 24, 'Symantec']]

ในการจัดเก็บวัตถุหลาม ควรใช้โมดูล pickle:

>>> import pickle
>>> data = [["Ms Office", "CD", 7, "Microsoft"], ["Acrobat Reader", "DVD", 12, "Adobe"], ["Norton Antivirus", "DVD", 24, "Symantec"]]
with open('my_data', 'w') as f:
    pickle.dump(data, f)
...     
with open('my_data') as f:
    print pickle.load(f)
...     
[['Ms Office', 'CD', 7, 'Microsoft'], ['Acrobat Reader', 'DVD', 12, 'Adobe'], ['Norton Antivirus', 'DVD', 24, 'Symantec']]
person Ashwini Chaudhary    schedule 21.09.2013
comment
ฉันต้องบันทึกรายการรายการที่โหลดจากไฟล์ลงในตัวแปรรายการที่สามารถใช้ในฟังก์ชันภายหลังได้ like thelist = [['Ms Office', 'CD', 7, 'Microsoft'], ['Acrobat Reader', 'DVD', 12, 'Adobe'], ['Norton Antivirus', 'DVD', 24, 'Symantec']] เมื่อฉันพยายามทำสิ่งนี้ด้วยรหัสของดอง ฉันได้รับข้อผิดพลาด msg: thelist = Pickle.load(f) TypeError: 'str' ไม่รองรับอินเทอร์เฟซบัฟเฟอร์ ฉันไม่รู้ว่าฉันกำลังทำอยู่หรือไม่ มันถูกต้อง ฉันเป็นมือใหม่กับ Python และเขียนโค้ดด้วยกัน - person user2802349; 21.09.2013
comment
@ user2802349 ฉันกำลังทำสิ่งนั้นอยู่แล้วในโค้ดแรก ส่วนโค้ดที่สองก็แค่ทำ: lis = pickle.load(data, f) - person Ashwini Chaudhary; 21.09.2013
comment
@ user2802349 f ในรหัสของคุณคืออะไร (f ควรเป็นวัตถุไฟล์) มันทำงานได้ดีสำหรับฉัน - person Ashwini Chaudhary; 21.09.2013
comment
ตกลง. ฉันไม่แน่ใจว่ามีอะไรผิดปกติ ฟังก์ชั่นของฉันในการบันทึกรายการ: def savelists(): data = thelist with open('my_data', 'w') as f: pickle.dump(data, f) รหัสของฉันที่จะโหลดข้อมูล: นำเข้าดองด้วย open('my_data ') as f: thelist = Pickle.load(data, f) print(thelist) ฉันควรทำให้ 'data' เป็นตัวแปรส่วนกลางหรือไม่ - person user2802349; 21.09.2013
comment
@ user2802349 อย่าวางโค้ดในความคิดเห็น มันอ่านไม่ได้ ใช้ ideone.com - person Ashwini Chaudhary; 21.09.2013
comment
@ user2802349 คุณแค่ต้องการ: pickle.load(f) อย่าผ่าน data ถึง load - person Ashwini Chaudhary; 21.09.2013
comment
@ user2802349 ใช้: thelist = pickle.load(f) - person Ashwini Chaudhary; 21.09.2013
comment
ฉันเปลี่ยนมันเป็นอย่างนั้น ตอนนี้มันบอกว่า thelist = Pickle.load(f) TypeError: 'str' ไม่รองรับอินเทอร์เฟซบัฟเฟอร์ - person user2802349; 21.09.2013
comment
@ user2802349 ฉันไม่รู้ว่าคุณกำลังทำอะไรอยู่ มันทำงานได้ดีบนระบบของฉัน: pastebin.com/iBbMcyE4 - person Ashwini Chaudhary; 21.09.2013
comment
ฉันเดาว่ามีบางอย่างผิดปกติ แม้ว่าการใช้โค้ดเพียงเล็กน้อยที่คุณเพิ่งส่งไปทดสอบ ฉันก็ยังได้รับข้อผิดพลาดที่ระบุว่า Pickle.dump(data, f) TypeError: must be str ไม่ใช่ bytes - person user2802349; 21.09.2013
comment
@ user2802349 คุณอยู่บน py3.x เหรอ? - person Ashwini Chaudhary; 21.09.2013
comment
python 3.3.2 :( ทำงานในส่วนนี้มาหลายวันแล้ว มีให้โหลดไหมถ้าปิดไฟล์ข้อความในตอนเริ่มต้นโดยไม่มีเครื่องหมายคำพูด? เหมือนไม่ได้นำเข้าโมดูลใดๆ หรือไม่? - person user2802349; 21.09.2013
comment
@ user2802349 เปิดไฟล์ในโหมดไบนารี: open('my_data', 'wb') และ ` open('my_data', 'rb') - person Ashwini Chaudhary; 21.09.2013
comment
@ user2802349 ไม่จำเป็นต้องประดิษฐ์วงล้อขึ้นมาใหม่ หากมีโมดูลมาตรฐานอยู่แล้วก็ใช้งานได้ :) - person Ashwini Chaudhary; 21.09.2013
comment
ข้อความแสดงข้อผิดพลาดเดียวกันนี้ปรากฏขึ้น: thelist = Pickle.load(f) TypeError: 'str' ไม่รองรับอินเทอร์เฟซบัฟเฟอร์ จุดประสงค์ทั้งหมดของโปรแกรมนี้คือการสร้างระบบควบคุมสต็อกสำหรับผู้ค้าส่งซอฟต์แวร์ ฉันทำครบทั้งโปรแกรมแล้ว โค้ดประมาณ 250 บรรทัด ทุกสิ่งที่เราได้เรียนรู้ในชั้นเรียน เรายังเรียนรู้วิธีบันทึกเนื้อหาพื้นฐานในไฟล์ข้อความอีกด้วย แต่ฉันมีรายการที่ซ้อนกันในโปรแกรมของฉันที่ต้องคงการเปลี่ยนแปลง (หากมีการเปลี่ยนแปลง) เมื่อโปรแกรมถูกปิดและโหลดขึ้นเพื่อใช้ในฟังก์ชันเมื่อเปิดโปรแกรมอีกครั้ง นี่เป็นวิธีเดียวที่ฉันสามารถทำได้ - person user2802349; 21.09.2013
comment
ขอบคุณมากสำหรับความช่วยเหลือของคุณ :) มีความหมายมาก :) - person user2802349; 21.09.2013