Python tuple จากไฟล์ขนาน [ซ้ำกัน]

ฉันมีสองไฟล์ที่สำหรับแต่ละไบต์ที่อ่านในไฟล์เดียว จะต้องทำอะไรบางอย่างกับไบต์ที่ตำแหน่งเดียวกันนั้นในอีกไฟล์หนึ่ง - Xor'ed กล่าว

ฉันหวังว่าฉันจะมีบางอย่างเช่นนี้ แต่ตอนนี้ฉันยังไม่มีโชค:

c = 0

f1 = list(file1.read())
f2 = list(file2.read())


for (a, b) in f1, f2: # set a and b for each byte in turn in f1 and f2
    c = a ^ b

สำหรับฉันในตอนแรกสิ่งนี้ให้ความรู้สึกเหมือน Python ค่อนข้างมาก แต่ตอนนี้ฉันเริ่มสงสัยแล้ว

พอยน์เตอร์ใด ๆ ยินดีเป็นอย่างยิ่ง!


person peedurrr    schedule 13.01.2014    source แหล่งที่มา


คำตอบ (1)


ใช้ zip() ฟังก์ชัน:

for a, b in zip(f1, f2):

หากไฟล์มีขนาดใหญ่ คุณอาจต้องการใช้ชิ้นส่วนที่เล็กลงและไม่อ่านไฟล์ทั้งหมดลงในหน่วยความจำ

สำหรับไฟล์ข้อความ เพียงวนซ้ำไฟล์โดยตรงเพื่อให้ได้บรรทัด:

try:
    from itertools import izip
except ImportError:  # Python 3, use builtin zip
    izip = zip

with file1, file2:
    for line1, line2 in izip(file1, file2):
        for a, b in izip(line1, line2):

โดยที่เราใช้ izip() function แทน (เฉพาะใน Python 2 เท่านั้น) เพื่อป้องกันไม่ให้ไฟล์ทั้งหมดถูกอ่านก่อน นอกจากนี้ยังถือว่าเส้นมีความยาวเท่ากัน

สำหรับไฟล์ไบนารี ให้อ่านเป็นชิ้นโดยใช้ขนาดยกกำลังสอง:

file1_it = iter(file1, lambda f: f.read(2048))
file2_it = iter(file2, lambda f: f.read(2048))

for chunk1, chunk2 in izip(file1_it, file2_it):
    for a, b in izip(chunk1, chunk2):
person Martijn Pieters    schedule 13.01.2014
comment
ฉันอยากจะเสริมว่าเหตุผลที่ izip ไม่ได้อยู่ใน python 3 ก็เพราะใน python 3 นั้น zip ทำงานเหมือนกับ izip อยู่แล้ว - person kazagistar; 13.01.2014
comment
@kazagistar: ใช่และฉันไม่ต้องการปกปิด zip() ในตัวใน Python 2 ดังนั้นตัวเลือกที่จะเชื่อมโยง zip ถึง izip ใน 3 แทนที่จะเป็นวิธีอื่น ๆ การ rebinding izip ถึง zip ใน Python 2 - person Martijn Pieters; 13.01.2014