我有一个列表['dog', 'cat', 'snake', 'lizard']
。我想使用此列表从文本文件中提取行。我的文本文件是以每行末尾的换行符分隔的制表符。每行有4列,第一列是我列表中的一个名称。前五行看起来像:
dog data1 data2 data3
dog data1 data2 data3
cat data1 data2 data3
snake data1 data2 data3
lizard data1 data2 data3
很多行。
我想为列表中的每个项目创建一个文本文件。在每个新文件中,我想要原始文件中的每一行,其中第一列与列表/新文件中的名称匹配。这是我写的代码:
filename = "data.txt"
f = open(filename, 'r')
#my list is named Species
for names in Species:
with open(str(names) + ".txt", 'w') as g:
for line in f:
row = line.split()
if names == row[0]:
g.write(row)
我能够创建我想要写入的文本文件,但没有任何内容写入文件。我收到没有错误消息。最后,我希望能够只为我有兴趣放入新文本文件的每一行提取一些数据列。
答案 0 :(得分:1)
尝试将列表直接写入文件(在Python中不合法)时,您应该收到错误:
Python 2.7:
Python 2.7.10 (default, Sep 13 2015, 20:30:50)
[GCC 5.2.1 20150911] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> with open("test", "w") as f:
... f.write([1,2,3,4])
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: expected a character buffer object
>>>
write
未被调用,可能是因为没有匹配Species[0]
的行。在for
上再次调用顶级Species[1]
循环时,f
已经位于文件末尾,并且不再提供任何行。 seek
到循环开始时文件的开头:
for name in Species:
f.seek(0)
with open(str(names) + ".txt", "w") as g:
for line in f:
if line.startswith(name):
g.write(line)
或者(这就是我要做的)您可以扫描f
一次,并在处理时将每一行分配给适当的动物:
records = {}
for line in f:
animal = line.split()[0]
if not records.get(animal):
records[animal] = []
records[animal].append(line)
for animal in records.keys():
with open("{}.txt".format(animal), "w") as f:
for line in records[animal]:
f.write(line)
答案 1 :(得分:1)
这是更新后的代码!
Species = ['dog', 'cat', 'snake', 'lizard']
filename = "data.txt"
for names in Species:
with open(str(names) + ".txt", 'w') as g:
f = open(filename, 'r')
for line in f:
row = line.split()
if names == row[0]:
g.write(str(row))
f.close()