我想读取一堆用逗号分隔的文本文件,找到特殊字符“ X”的位置,并在字符串所属的同一行中返回“ Z”。文本文件如下所示:
"a1", "a2", "a3"
"b1", "b2", "b3"
"c1", "c2", "c3"
...
"X", "Y", "Z"
...
"n1", "n2", "n3"
出现“ X”的行数因文件而异。因此,我想编写一个可应用于所有文件的函数,以字符串形式返回“ Z”。
我尝试了以下代码:
from itertools import islice
def _function():
z = [0,0,0]
f = open(file, 'r')
num = sum(1 for line in f)
for i in islice(f, 0, num):
x = f.readline()
y = x.find('X')
if y == -1:
pass
else:
z = f.readline().rstrip().split(',')
return z[2]
但是,当我运行代码时,结果为0,这意味着代码没有循环。
我还发现,当我使用f = open(file)
时,它只持续一行代码。
我当前的版本是Anaconda上的Python 3.7。谢谢!
答案 0 :(得分:1)
问题1:
对于y == -1
情况,仅在z
情况下,您没有提供else
的任何值(对此也没有其他任何地方)。
那么,z[2]
到来时y == -1
会返回什么?
本质上,您需要为该情况或更早的情况z
设置一个占位符值。占位符更好的地方是将其设置在for
循环之前,这样您就不必在每次迭代时都进行名称绑定。
问题2:
您已经通过计算行数来耗尽文件对象 iterator :
num = sum(1 for line in f)
因此,当您在循环内的下一个位置执行f.readline()
时,它将始终返回一个空字符串。
一个简单的解决方法是将seek
返回文件的开头:
f.seek(0)
在num之后,然后进入循环。
但是那仍然不是Pythonic ,最好的方法是使用for
循环遍历文件的各行(因为文件对象是迭代器),您可以这样做吗? / p>
for line in f:
y = line.find('X')
...
...
当然,由于open
是上下文管理器,因此使用它来自动处理文件的正确close
->
with open('file.txt') as f:
for line in f:
# Do stuffs
(不要花太多时间在算法中,因为这将是代码审查的问题。)