Python 如何在readlines中拆分行并将它们保存在不同的列表中?

Python 如何在readlines中拆分行并将它们保存在不同的列表中?,python,split,nlp,tokenize,readlines,Python,Split,Nlp,Tokenize,Readlines,这是我的密码 with open('file.txt', 'r') as source: # Indentation polTerm = [line.strip().split()[0] for line in source.readlines()] polFreq = [int(line.strip().split()[1]) for line in source.readlines()] 这在file.txt中 anak 1 aset 3 atas 1 bangun

这是我的密码

with open('file.txt', 'r') as source:
    # Indentation
    polTerm = [line.strip().split()[0] for line in source.readlines()]
    polFreq = [int(line.strip().split()[1]) for line in source.readlines()]
这在file.txt中

anak 1
aset 3
atas 1
bangun 1
bank 9
benar 1
bentuk 1
我得到了我想要的术语:

['anak'、'aset'、'atas'、'bangun'、'bank'、'benar'、'bentuk']

但是对于polFreq,不是这样:

['1','3','1','1','9','1','1']

我得到的是这样的空白列表:

[]

有人知道为什么会这样吗?以及如何解决这个问题,这样我就能得到我想要的

with open('file.txt', 'r') as source:
    lines = source.readlines()
    polTerm = [line.strip().split()[0] for line in lines]
    polFreq = [int(line.strip().split()[1]) for line in lines]
原因是
readlines()
是一个迭代器,因此第一次调用已经使用了它,它变为空,当您第二次尝试使用该空迭代器时,您发现它为空

with open('file.txt','r') as source:
     data=source.readlines()
a1=[] 
a2=[] 
for line in data:
     x=line.split()
     a1.append(x[0])
     a2.append(x[1])

原因是,
readlines()
是一个迭代器,因此第一次调用已经使用了它,它变成了空的,当您第二次尝试使用该空迭代器时,您会发现它是空的。

@carcgeniate为您提供了字面上的答案

with open('file.txt','r') as source:
     data=source.readlines()
a1=[] 
a2=[] 
for line in data:
     x=line.split()
     a1.append(x[0])
     a2.append(x[1])
然而,在我看来,你不应该把文件读两遍(除了文件实在太大了,而且它的所有行都无法放入内存之外)

如果文件不是那么大,就不需要在文件中读取两次。 如果它有点大,那么只需将前两列读入内存即可。 然后把它们分开

我的建议是:

with open('file.txt', 'r') as source:
    cols_1_and_2 = [line.strip().split(None, 2)[:2] for line in source.readlines()]

polTerm = [cols[0] for cols in cols_1_and_2]
polFreq = [int(cols[1]) for cols in cols_1_and_2]
del cols_1_and_2  # this line is to free some memory if that would be an issue

@Carcgenicate会给你一个直截了当的答案

然而,在我看来,你不应该把文件读两遍(除了文件实在太大了,而且它的所有行都无法放入内存之外)

如果文件不是那么大,就不需要在文件中读取两次。 如果它有点大,那么只需将前两列读入内存即可。 然后把它们分开

我的建议是:

with open('file.txt', 'r') as source:
    cols_1_and_2 = [line.strip().split(None, 2)[:2] for line in source.readlines()]

polTerm = [cols[0] for cols in cols_1_and_2]
polFreq = [int(cols[1]) for cols in cols_1_and_2]
del cols_1_and_2  # this line is to free some memory if that would be an issue

正如Carcigenicate所说,
.readlines
是一个返回列表的生成器。如果不将该列表保存在变量中,则第二次调用生成器将不会返回任何结果,因为在第一次调用时生成器已耗尽。您需要的是:

以open(“file.txt”,“r”)作为inf:
#现在,行列表保存在全局变量中
#可与open()一起在外部使用。
#.readlines生成器已耗尽,无法返回
#什么都行。
raw=inf.readlines()
polTerm=[line.strip().split()[0]用于原始数据中的行]
polFreq=[int(line.strip().split()[1])表示原始数据中的行]

专业提示:学习使用pandas,特别是pd.read_csv()。

正如Carcigenicate所说,
。readlines
是一个返回列表的生成器。如果您不将该列表保存在变量中,第二次调用生成器将不会返回任何结果,因为在第一次调用时生成器已耗尽。您需要的是:

以open(“file.txt”,“r”)作为inf:
#现在,行列表保存在全局变量中
#可与open()一起在外部使用。
#.readlines生成器已耗尽,无法返回
#什么都行。
raw=inf.readlines()
polTerm=[line.strip().split()[0]用于原始数据中的行]
polFreq=[int(line.strip().split()[1])表示原始数据中的行]


专业提示:学习使用pandas,特别是pd.read_csv()。

这能回答你的问题吗?谢谢你的回答!另一个问题,除了这个问题,还有更好的方法吗?谢谢!我只是在
lines=source.readlines()之前添加
polTerm=[line.strip().split()[0]来表示source.readlines()]
并更改所有
源代码。阅读行
您有4个答案,似乎解决了您的问题。您仍然需要有关这些答案的一些细节的帮助或建议?这是否回答了您的问题?谢谢您的回答!另一个问题,除此之外还有更好的方法吗?谢谢!我只添加了
行=源代码.readlines()
before
polTerm=[line.strip().split()[0]用于source.readlines()中的行
并更改所有
源代码。readlines
lines
您有4个答案,似乎可以解决您的问题。您仍然需要有关这些答案的一些详细信息的帮助或建议?您可以取消最后两行的记录。它们不必位于
with
语句中。这会稍微关闭文件earlier@gelonida我知道,但是这是另一个问题,一个效率问题。如果你同时回答两个问题,这可能会增加询问者的复杂性。我只是勉强修改了他的代码,以便他能够跟进并找出错误的地方。是的。我只是认为这样更容易阅读,并且更清楚地表明文件访问已经完成(该文件仅读取一次)。但在这种情况下,这当然不是很重要。您可以取消最后两行的插入。它们不必位于
with
语句中。这会稍微关闭文件earlier@gelonida我知道。但这是另一个问题,一个效率问题。如果你同时回答两个问题,这可能会增加复杂性我只是勉强修改了他的代码,这样他就可以继续下去,找出哪里弄错了。是的。我只是觉得这样更容易阅读,并且更清楚地表明文件访问已经完成(文件只读取一次)。但在这种情况下,这当然不是很重要。您可以在
data=
行之后立即取消缩进。这将更早地关闭文件并降低缩进级别(在我看来通常是个好主意)这是真的,谢谢你的建议,这对提高效率非常有用。你可以在
data=
行之后立即取消缩进。这将更早地关闭文件并降低缩进级别(在我看来通常是个好主意)。这是真的,谢谢你的建议,这对提高效率非常有用。