Bagaimana cara memuat daftar bersarang dari file tanpa tanda kutip?

Saya seharusnya membuat sistem "kontrol stok" untuk grosir perangkat lunak untuk penugasan modul. Saya telah membuat programnya, tetapi saya kesulitan menyimpan sesuatu secara permanen. Program ini terdiri dari daftar bersarang seperti berikut:

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

Saya dapat menyimpannya ke dokumen teks dalam format

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

Namun ketika saya mencoba memuatnya kembali sebagai daftar dalam format yang sama, saya mendapatkan tanda kutip yang memisahkan setiap entri seperti ini:

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

Saya hanya perlu menghilangkan tanda kutip ganda yang mengelilingi setiap item dalam daftar sekarang. Kode yang saya gunakan untuk memuat file ini:

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

Saya telah mencari berjam-jam secara online dan telah mencoba segalanya tetapi saya masih tidak dapat menemukan cara untuk membuatnya berhasil. Saya telah melihat banyak orang menyarankan modul CSV, tetapi saya tidak tahu bagaimana menerapkannya pada kode saya.


person user2802349    schedule 21.09.2013    source sumber


Jawaban (1)


Gunakan 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']]

Untuk menyimpan objek python lebih baik menggunakan modul 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
Saya perlu menyimpan daftar yang diambil dari file ke dalam variabel daftar yang dapat digunakan dalam fungsi selanjutnya. seperti daftar = [['Ms Office', 'CD', 7, 'Microsoft'], ['Acrobat Reader', 'DVD', 12, 'Adobe'], ['Norton Antivirus', 'DVD', 24, 'Symantec']] ketika saya mencoba melakukan ini dengan kode acar saya mendapatkan pesan kesalahan: thelist = acar.load(f) TypeError: 'str' tidak mendukung antarmuka buffer Saya tidak tahu apakah saya melakukannya itu benar. Saya seorang pemula dalam python dan coding sama sekali - person user2802349; 21.09.2013
comment
@ user2802349 Saya sudah melakukan itu di kode pertama, di kode kedua lakukan saja: lis = pickle.load(data, f). - person Ashwini Chaudhary; 21.09.2013
comment
@ user2802349 Apa f dalam kode Anda? (f harus berupa objek file) Ini berfungsi dengan baik untuk saya. - person Ashwini Chaudhary; 21.09.2013
comment
OKE. Saya tidak yakin apa yang salah. Fungsi saya untuk menyimpan daftar: def savelists(): data = thelist dengan open('my_data', 'w') as f: acar.dump(data, f) Kode saya untuk memuat data: import acar dengan open('my_data ') sebagai f: thelist = acar.load(data, f) print(thelist) Haruskah saya menjadikan 'data' sebagai variabel global? - person user2802349; 21.09.2013
comment
@ user2802349 Jangan tempel kode di komentar, kode tidak dapat dibaca. Gunakan ideone.com - person Ashwini Chaudhary; 21.09.2013
comment
@ user2802349 Anda hanya perlu: pickle.load(f), jangan meneruskan data ke load. - person Ashwini Chaudhary; 21.09.2013
comment
@user2802349 Penggunaan: thelist = pickle.load(f) - person Ashwini Chaudhary; 21.09.2013
comment
Saya mengubahnya menjadi itu. Sekarang dikatakan thelist = acar.load(f) TypeError: 'str' tidak mendukung antarmuka buffer - person user2802349; 21.09.2013
comment
@ user2802349 Saya tidak tahu apa yang Anda lakukan, ini berfungsi dengan baik di sistem saya: pastebin.com/iBbMcyE4 - person Ashwini Chaudhary; 21.09.2013
comment
Kurasa ada yang salah. Bahkan hanya dengan menggunakan sedikit kode yang baru saja Anda kirim untuk mengujinya, saya mendapatkan kesalahan yang mengatakan acar.dump(data, f) TypeError: must be str, not bytes - person user2802349; 21.09.2013
comment
@ user2802349 Anda menggunakan py3.x? - person Ashwini Chaudhary; 21.09.2013
comment
python 3.3.2 :( Telah mengerjakan bagian ini selama berhari-hari. Apakah ada cara untuk memuat file teks di awal tanpa tanda kutip? Seperti tanpa mengimpor modul apa pun? - person user2802349; 21.09.2013
comment
@ user2802349 buka file dalam mode biner: open('my_data', 'wb') dan ` open('my_data', 'rb') - person Ashwini Chaudhary; 21.09.2013
comment
@ user2802349 Tidak perlu menemukan kembali roda, jika modul standar sudah tersedia maka gunakanlah. :) - person Ashwini Chaudhary; 21.09.2013
comment
Pesan kesalahan yang sama muncul: thelist = acar.load(f) TypeError: 'str' tidak mendukung antarmuka buffer Inti dari program ini adalah untuk menciptakan sistem kontrol stok untuk grosir perangkat lunak. Saya sudah menyelesaikan seluruh program. Sekitar 250 baris kode. Semua yang kami pelajari di kelas. Kami juga mempelajari cara menyimpan hal-hal dasar dalam file teks. Tetapi saya memiliki daftar bersarang di program saya yang perlu tetap diubah (jika ada perubahan) ketika program ditutup dan dimuat untuk digunakan dalam fungsi ketika program dibuka kembali. Ini adalah satu-satunya cara yang dapat saya lakukan untuk melakukannya. - person user2802349; 21.09.2013
comment
Terima kasih banyak atas semua bantuan Anda :) Sangat berarti :) - person user2802349; 21.09.2013