Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在逗号分隔的文本文件中查找字符,并返回它所属的字符串_Python_Scope_Iterator_Text Files - Fatal编程技术网

Python 在逗号分隔的文本文件中查找字符,并返回它所属的字符串

Python 在逗号分隔的文本文件中查找字符,并返回它所属的字符串,python,scope,iterator,text-files,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 de

我有一堆逗号分隔的文本文件,我想读入它们,找到一个特殊字符“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期:

对于
y==-1
情况,您没有为
z
提供任何值(也没有在其他任何地方提供),仅在
else
情况下

那么,当
y==-1
获取
z[2]
时,会返回什么

本质上,您需要为该情况或之前的
z
设置占位符值。占位符的更好位置是在
for
循环之前设置占位符,这样就不需要在每次迭代中进行名称绑定

第二期:

您已经通过计算行数耗尽了文件对象迭代器:

num = sum(1 for line in f)
因此,当您在循环中执行
f.readline()
下一步操作时,它将始终返回一个空字符串

一个简单的解决方法是
查找
返回到文件的开头:

f.seek(0)
with open('file.txt') as f:
    for line in f:
        # Do stuffs
在num之后,进入循环之前

但这仍然不是Pythonic,最好的方法是使用
for
循环对文件行进行迭代(因为文件对象是迭代器),您是否可以:

for line in f:
    y = line.find('X')
    ...
    ...  
当然,由于
open
是一个上下文管理器,因此使用它可以自动处理文件的正确
关闭:

f.seek(0)
with open('file.txt') as f:
    for line in f:
        # Do stuffs

(不要过多地讨论您的算法,因为这将是代码审查的问题。)

在for之前,您应该定义变量
z
loop@Nihal所以我在循环之前定义了
z=[0,0,0]
,结果是0,这意味着代码没有循环谢谢你的评论。所以我在循环之前定义了
z=[0,0,0]
,结果是0,这意味着代码没有循环。你能提供一些见解吗?