İki sütun içeren bir dosyam var, yani
1 a
2 b
3 c
Bu dosyayı, 1. sütun anahtar ve 2. sütun değer olacak şekilde bir sözlüğe okumak istiyorum.
d = {1:'a', 2:'b', 3:'c'}
Dosya küçük, bu nedenle verimlilik bir sorun değil.
İki sütun içeren bir dosyam var, yani
1 a
2 b
3 c
Bu dosyayı, 1. sütun anahtar ve 2. sütun değer olacak şekilde bir sözlüğe okumak istiyorum.
d = {1:'a', 2:'b', 3:'c'}
Dosya küçük, bu nedenle verimlilik bir sorun değil.
Yanıtlar:
d = {}
with open("file.txt") as f:
for line in f:
(key, val) = line.split()
d[int(key)] = val
with
burada dosya temizliğini işlemek için kullanılır. Bloku terk ettiğinizde (sadece normal yürütme akışı ile veya bir istisna ile) dosya otomatik olarak kapatılacaktır. Python'daki bağlam yöneticileri hakkında daha fazla bilgiyi buradan okuyabilirsiniz: effbot.org/zone/python-with-statement.htm
for line in open("file.txt"):
temizliği aynı şekilde yapın. Ve eğer f yerel bir değerse f
, kapsam kaybolduğunda serbest bırakılır. Bu ifadenin yararlı olduğu tek durum, uzun işlev için (kalite için iyi değildir) veya bir global değişken kullanmanızdır.
for line in open('file.txt')
yok değil Cleanup aynı şekilde yapmak. Tüm Python uygulamaları aynı değildir. with
bloktan çıkıldığında dosyanın kapatılacağını garanti eder. Ne zaman for
çizgisi tamamlandığında, close
olabilir çağrılabilir. CPython
olacak, ancak gibi sürümlerde IronPython
tembel çöp toplayıcıları var.
Bu, anahtarı bir dizge olarak bırakacaktır:
with open('infile.txt') as f:
d = dict(x.rstrip().split(None, 1) for x in f)
dict([line.split() for line in f])
yeterlidir, imo.
dict([x.rstrip().split(None, 1) for x in f])
yerine dict(x.rstrip().split(None, 1) for x in f)
. Aynı şeyi düşünenler için, ilki, burada açıklandığı gibi liste anlama yerine bir üretici ifadesidir: python.org/dev/peps/pep-0289(PEP-289) . Yeni bir şey öğrendim!
Aşağıdakiler gibi bir dikte anlama da kullanabilirsiniz :
with open("infile.txt") as f:
d = {int(k): v for line in f for (k, v) in [line.strip().split(None, 1)]}
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)
partition
? ve with
açıklama?
partition
daha hızlıdır ve tam da bu amaç için yaratılmıştır.
with
olduğundan emin olmanın basit bir yoludur.
strip
, derdim.
Sözlük anlayışına göre
d = { line.split()[0] : line.split()[1] for line in open("file.txt") }
Veya pandalar tarafından
import pandas as pd
d = pd.read_csv("file.txt", delimiter=" ", header = None).to_dict()[0]
IMHO, jeneratörleri kullanmak için biraz daha pitonik (bunun için muhtemelen 2.7+ gerekir):
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()}
Bu ayrıca tamsayı ile başlamayan veya tam olarak iki öğe içermeyen satırları da filtreleyecektir.
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)
re
? ciddi anlamda?
split()
dosya biçimi mantıklı değilse neredeyse sessizce çalışmaz.
Bir gömlek seviyorsanız, deneyin:
d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')
FILE girişi = Dosyaya giden yol, SEP = Anahtar-Değer ayırıcı karakteri
Bunu yapmanın en zarif veya verimli yolu değil, ama yine de oldukça ilginç :)
İşte başka bir seçenek ...
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:]
Bir sözlüğü saklamak için kullanılan çoğu yöntem JSON, Pickle veya satır okumayı kullanır. Sözlüğü Python dışında düzenlemediğiniz sürece, bu basit yöntem karmaşık sözlükler için bile yeterli olacaktır. Turşu daha büyük sözlükler için daha iyi olsa da.
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
Metin dosyasından değerler alıp anahtar değer çifti olarak kullanma zorunluluğum vardı. metin dosyasında anahtar = değer olarak içeriğim var, bu yüzden ayırıcıyı "=" olarak ayırma yöntemini kullandım ve aşağıdaki kodu yazdım
d = {}
file = open("filename.txt")
for x in file:
f = x.split("=")
d.update({f[0].strip(): f[1].strip()})
Şerit yöntemini kullanarak, "=" ayırıcısından önceki veya sonraki boşluklar kaldırılır ve beklenen verilere sözlük biçiminde sahip olursunuz
=
`` soruyu cevaplamak için '' ile değiştirecek şekilde düzenleyebilir misiniz ?