Saya memiliki file yang terdiri dari dua kolom, yaitu,
1 a
2 b
3 c
Saya ingin membaca file ini ke kamus sehingga kolom 1 adalah kunci dan kolom 2 adalah nilainya, yaitu,
d = {1:'a', 2:'b', 3:'c'}
Berkasnya kecil, jadi efisiensi bukanlah masalah.
python
file
dictionary
Darren J. Fitzpatrick
sumber
sumber
with
digunakan di sini untuk menangani pembersihan file. Ketika Anda meninggalkan blok (baik hanya dengan aliran eksekusi normal atau dengan pengecualian) ada file yang akan ditutup secara otomatis. Anda dapat membaca lebih lanjut tentang pengelola konteks dengan Python di sini: effbot.org/zone/python-with-statement.htmfor line in open("file.txt"):
lakukan pembersihan dengan cara yang sama. Dan jika f adalah nilai lokal,f
dilepaskan saat cakupan hilang. Satu-satunya kasus di mana pernyataan ini berguna adalah untuk fungsi panjang (tidak baik untuk kualitas), atau jika Anda menggunakan variabel global.for line in open('file.txt')
tidak tidak melakukan pembersihan dengan cara yang sama. Tidak semua implementasi Python sama.with
menjamin file akan ditutup ketika blok keluar. Bilafor
antrean sudah selesai,close
boleh dipanggil.CPython
itu akan, tetapi versi sepertiIronPython
memiliki pengumpul sampah yang malas.Ini akan meninggalkan kunci sebagai string:
with open('infile.txt') as f: d = dict(x.rstrip().split(None, 1) for x in f)
sumber
dict([line.split() for line in f])
sudah cukup, imo.dict([x.rstrip().split(None, 1) for x in f])
bukandict(x.rstrip().split(None, 1) for x in f)
. Bagi mereka yang berpikiran sama, yang pertama adalah ekspresi generator daripada pemahaman daftar seperti yang dijelaskan di sini: python.org/dev/peps/pep-0289(PEP-289) . Mempelajari sesuatu yang baru!Anda juga dapat menggunakan pemahaman dikt seperti:
with open("infile.txt") as f: d = {int(k): v for line in f for (k, v) in [line.strip().split(None, 1)]}
sumber
def get_pair(line): key, sep, value = line.strip().partition(" ") return int(key), value with open("file.txt") as fd: d = dict(get_pair(line) for line in fd)
sumber
partition
? danwith
pernyataan?partition
lebih cepat dan dibuat tepat untuk tujuan ini.with
adalah cara sederhana untuk memastikannya.strip
, kataku.Dengan pemahaman kamus
d = { line.split()[0] : line.split()[1] for line in open("file.txt") }
Atau dengan panda
import pandas as pd d = pd.read_csv("file.txt", delimiter=" ", header = None).to_dict()[0]
sumber
IMHO sedikit lebih pythonic untuk menggunakan generator (mungkin Anda membutuhkan 2.7+ untuk ini):
with open('infile.txt') as fd: pairs = (line.split(None) for line in fd) res = {int(pair[0]):pair[1] for pair in pairs if len(pair) == 2 and pair[0].isdigit()}
Ini juga akan memfilter baris yang tidak dimulai dengan bilangan bulat atau tidak berisi tepat dua item
sumber
import re my_file = open('file.txt','r') d = {} for i in my_file: g = re.search(r'(\d+)\s+(.*)', i) # glob line containing an int and a string d[int(g.group(1))] = g.group(2)
sumber
re
? serius?split()
tidak bekerja hampir tanpa suara jika format file tidak waras.Jika Anda menyukai satu kalimat, coba:
d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')
Input FILE = Jalur ke file, SEP = Karakter pemisah Nilai-Kunci
Bukan cara yang paling elegan atau efisien untuk melakukannya, tapi tetap saja cukup menarik :)
sumber
Berikut opsi lain ...
events = {} for line in csv.reader(open(os.path.join(path, 'events.txt'), "rb")): if line[0][0] == "#": continue events[line[0]] = line[1] if len(line) == 2 else line[1:]
sumber
Opsi Sederhana
Kebanyakan metode untuk menyimpan kamus menggunakan JSON, Pickle, atau membaca baris. Asalkan Anda tidak mengedit kamus di luar Python, metode sederhana ini sudah cukup bahkan untuk kamus yang rumit. Meskipun Pickle lebih baik untuk kamus yang lebih besar.
x = {1:'a', 2:'b', 3:'c'} f = 'file.txt' print(x, file=open(f,'w')) # file.txt >>> {1:'a', 2:'b', 3:'c'} y = eval(open(f,'r').read()) print(x==y) # >>> True
sumber
Saya memiliki persyaratan untuk mengambil nilai dari file teks dan digunakan sebagai pasangan nilai kunci. Saya memiliki konten dalam file teks sebagai key = value, jadi saya telah menggunakan metode split dengan pemisah sebagai "=" dan menulis di bawah kode
d = {} file = open("filename.txt") for x in file: f = x.split("=") d.update({f[0].strip(): f[1].strip()})
Dengan menggunakan metode strip, spasi apa pun sebelum atau sesudah pemisah "=" dihapus dan Anda akan memiliki data yang diharapkan dalam format kamus
sumber
=
dengan `` untuk menjawab pertanyaan?