ฉันมีไฟล์ที่ประกอบด้วยสองคอลัมน์คือ
1 a
2 b
3 c
ฉันต้องการอ่านไฟล์นี้ในพจนานุกรมเพื่อให้คอลัมน์ 1 เป็นคีย์และคอลัมน์ 2 คือค่านั่นคือ
d = {1:'a', 2:'b', 3:'c'}
ไฟล์มีขนาดเล็กประสิทธิภาพจึงไม่ใช่ปัญหา
ฉันมีไฟล์ที่ประกอบด้วยสองคอลัมน์คือ
1 a
2 b
3 c
ฉันต้องการอ่านไฟล์นี้ในพจนานุกรมเพื่อให้คอลัมน์ 1 เป็นคีย์และคอลัมน์ 2 คือค่านั่นคือ
d = {1:'a', 2:'b', 3:'c'}
ไฟล์มีขนาดเล็กประสิทธิภาพจึงไม่ใช่ปัญหา
คำตอบ:
d = {}
with open("file.txt") as f:
for line in f:
(key, val) = line.split()
d[int(key)] = val
with
ใช้ที่นี่เพื่อจัดการกับการล้างไฟล์ เมื่อคุณออกจากบล็อก (โดยใช้ขั้นตอนการดำเนินการปกติหรือโดยข้อยกเว้น) ไฟล์จะถูกปิดโดยอัตโนมัติ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับผู้จัดการบริบทใน Python ได้ที่นี่: effbot.org/zone/python-with-statement.htm
for line in open("file.txt"):
ทำการล้างด้วยวิธีเดียวกัน และถ้า f เป็นค่าโลคัลระบบf
จะปล่อยเมื่อขอบเขตหายไป กรณีเดียวที่คำสั่งนี้มีประโยชน์สำหรับฟังก์ชันแบบยาว (ไม่ดีต่อคุณภาพ) หรือหากคุณใช้ตัวแปรส่วนกลาง
for line in open('file.txt')
ไม่ได้ทำการล้างข้อมูลในลักษณะเดียวกัน การใช้งาน Python ทั้งหมดไม่เหมือนกัน with
รับประกันว่าไฟล์จะถูกปิดเมื่อออกจากบล็อก เมื่อfor
สายสมบูรณ์close
อาจเรียก. CPython
มันจะ แต่รุ่นเหมือนIronPython
มีคนเก็บขยะขี้เกียจ
สิ่งนี้จะปล่อยให้คีย์เป็นสตริง:
with open('infile.txt') as f:
d = dict(x.rstrip().split(None, 1) for x in f)
dict([line.split() for line in f])
ก็เพียงพอแล้ว imo
dict([x.rstrip().split(None, 1) for x in f])
แทนdict(x.rstrip().split(None, 1) for x in f)
. สำหรับผู้ที่คิดในสิ่งเดียวกันในอดีตคือการแสดงออกเครื่องกำเนิดไฟฟ้าแทนของรายการความเข้าใจตามที่อธิบายไว้ที่นี่: python.org/dev/peps/pep-0289(PEP-289) ได้เรียนรู้สิ่งใหม่!
คุณยังสามารถใช้การเข้าใจคำสั่งเช่น:
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
? และwith
คำสั่ง?
partition
เร็วกว่าและถูกสร้างขึ้นเพื่อจุดประสงค์นี้
with
เป็นวิธีง่ายๆเพื่อให้แน่ใจว่าเป็นเช่นนั้น
strip
ฉันจะบอกว่า
ตามความเข้าใจในพจนานุกรม
d = { line.split()[0] : line.split()[1] for line in open("file.txt") }
หรือโดยแพนด้า
import pandas as pd
d = pd.read_csv("file.txt", delimiter=" ", header = None).to_dict()[0]
IMHO pythonic อีกเล็กน้อยเพื่อใช้เครื่องกำเนิดไฟฟ้า (คุณอาจต้องใช้ 2.7+ สำหรับสิ่งนี้):
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()}
นอกจากนี้ยังจะกรองบรรทัดที่ไม่ได้ขึ้นต้นด้วยจำนวนเต็มหรือไม่มีสองรายการ
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
เหรอ? อย่างจริงจัง?
split()
ไม่ทำงานเกือบจะเงียบถ้ารูปแบบไฟล์ไม่เป็นไปอย่างมีเหตุผล
ถ้าคุณรักเรือเดินสมุทรลอง:
d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')
ป้อนไฟล์ = เส้นทางไปยังไฟล์ SEP = อักขระคั่นคีย์ - ค่า
ไม่ใช่วิธีที่หรูหราหรือมีประสิทธิภาพที่สุดในการทำ แต่ก็น่าสนใจทีเดียว :)
นี่เป็นอีกทางเลือกหนึ่ง ...
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:]
วิธีการส่วนใหญ่ในการจัดเก็บพจนานุกรมใช้ JSON, Pickle หรือการอ่านบรรทัด หากคุณไม่ได้แก้ไขพจนานุกรมนอก Python วิธีง่ายๆนี้ก็น่าจะเพียงพอสำหรับพจนานุกรมที่ซับซ้อน แม้ว่า Pickle จะดีกว่าสำหรับพจนานุกรมขนาดใหญ่
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
ฉันมีความต้องการที่จะรับค่าจากไฟล์ข้อความและใช้เป็นคู่ค่าคีย์ ฉันมีเนื้อหาในไฟล์ข้อความเป็น key = value ดังนั้นฉันจึงใช้วิธีการแยกโดยมีตัวคั่นเป็น "=" และเขียนโค้ดด้านล่าง
d = {}
file = open("filename.txt")
for x in file:
f = x.split("=")
d.update({f[0].strip(): f[1].strip()})
โดยใช้วิธีแถบช่องว่างก่อนหรือหลังตัวคั่น "=" จะถูกลบออกและคุณจะมีข้อมูลที่คาดไว้ในรูปแบบพจนานุกรม
=
ด้วย `เพื่อตอบคำถามได้หรือไม่?