我在弄清楚以下幾點時遇到了一些麻煩:
例如,我有一個 100 行的檔案,我們稱它為檔案 A
例如,我還有另一個 100 行的檔案,我們稱它為檔案 B
現在我需要第一個回圈從檔案 A 中讀取 10 行并執行此操作,然后轉到另一個回圈從檔案 B 中讀取 10 行,執行此操作,然后回傳第一個回圈執行 11-20 行檔案 A 然后回傳第二個回圈,從檔案 B 執行 11-20 行。
我需要兩個回圈來記住從哪一行讀取。
我應該如何處理這個?
謝謝!
編輯:
像這樣的東西可以嗎?
a=0
b=10
x=0
y=10
for 1000 times:
read a-b rows:
do its thing
a = 10
b = 10
read x-y rows:
do its thing
x = 10
y = 10
uj5u.com熱心網友回復:
您可以使用這種方法一次迭代 10 行以上。
class File:
def __init__(self, filename):
self.f = open(filename, 'r')
def line(self):
yield self.f.readline()
def next(self, limit):
for each in range(limit):
yield self.f.readline()
def lines(self, limit=10):
return [x for x in self.next(limit=limit)]
file1 = File('C:\\Temp\\test.csv')
file2 = File('C:\\Temp\\test2.csv')
print(file1.lines(10)
print(file2.lines(10)
print(file1.lines(10)
print(file2.lines(10)
現在您可以在遍歷接下來的 10 行的檔案之間來回跳轉。
uj5u.com熱心網友回復:
這是另一個使用生成器和背景關系管理器的解決方案:
class SwitchFileReader():
def __init__(self, file_paths, lines = 10):
self.file_paths = file_paths
self.file_objects = []
self.lines = 1 if lines < 1 else lines
def __enter__(self):
for file in self.file_paths:
file_object = open(file, "r")
self.file_objects.append(file_object)
return self
def __exit__(self, type, value, traceback):
for file in self.file_objects:
file.close()
def __iter__(self):
while True:
next_lines = [
[file.readline() for _ in range(self.lines)]
for file in self.file_objects
]
if any(not all(lines) for lines in next_lines):
break
for lines in next_lines:
yield lines
file_a = r"D:\projects\playground\python\stackgis\data\TestA.txt"
file_b = r"D:\projects\playground\python\stackgis\data\TestB.txt"
with SwitchFileReader([file_a, file_b], 10) as file_changer:
for next_lines in file_changer:
print(next_lines , end="") # do your thing
只要任何檔案中剩余的行數減少,迭代就會停止。
假設file_a有 12 行,file_b有 13 行。第 11 和 12file_a行以及第 11 到 13file_b行將被忽略。
uj5u.com熱心網友回復:
為簡單起見,我將使用list. 您可以將檔案讀入串列。
讓我們拆分問題。我們需要
- 按任意數字對每個串列進行分組。在你的情況下 10
- 為兩個陣列回圈每 10 束。
分組
這是一個答案:https ://stackoverflow.com/a/4998460/2681662
def group_by_each(lst, N):
return [lst[n:n N] for n in range(0, len(lst), N)]
同時回圈兩個list:
您可以為此使用 zip。
lst1 = list(range(100)) # <- Your data
lst2 = list(range(100, 200)) # <-- Your second data
def group_by_each(lst, N):
return [lst[n:n N] for n in range(0, len(lst), N)]
for ten1, ten2 in zip(group_by_each(lst1, 10), group_by_each(lst2, 10)):
print(ten1)
print(ten2)
uj5u.com熱心網友回復:
當您遍歷檔案物件時,它會在關聯檔案中產生行。您只需要一個回圈,每次迭代都從兩個檔案中獲取接下來的十行。在此示例中,只要任一檔案用完,回圈就會結束:
from itertools import islice
lines_per_iter = 10
file_a = open("file_a.txt", "r")
file_b = open("file_b.txt", "r")
while (a := list(islice(file_a, lines_per_iter))) and (b := list(islice(file_b, lines_per_iter))):
print(f"Next {lines_per_iter} lines from A: {a}")
print(f"Next {lines_per_iter} lines from B: {b}")
file_a.close()
file_b.close()
uj5u.com熱心網友回復:
好的,謝謝您的所有回答,我找到了一個適用于我的專案的解決方案,如下所示:
a=0
b=10
x=0
y=10
while True:
for list1 in range(a, b):
#read the lines from file A
a = 10
b = 10
for list2 in range(x, y):
#read the lines from file B
if y == 100:
break
x = 10
y = 10
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/439916.html
下一篇:我正在嘗試制作一個迷你游戲。運動在python中的X和Y坐標范圍內,范圍在-5和5之間。我如何把它放在一個回圈中
