在逗号分隔的文本文件中找到一个字符,然后返回它所属的字符串

时间:2019-03-25 07:31:32

标签: python scope iterator text-files

我想读取一堆用逗号分隔的文本文件,找到特殊字符“ 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。谢谢!

1 个答案:

答案 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

(不要花太多时间在算法中,因为这将是代码审查的问题。)