python:当第一列与列表中的字符串匹配时,从文本文件中提取行

python:当第一列与列表中的字符串匹配时,从文本文件中提取行,python,Python,我有一个列表[‘狗’、‘猫’、‘蛇’、‘蜥蜴’]。我想使用此列表从文本文件中提取行。我的文本文件以制表符分隔,每行末尾都有新行字符。每行有4列,第一列是我列表中的一个名称。前五行看起来像: dog data1 data2 data3 dog data1 data2 data3 cat data1 data2 data3 snake data1 data2 data3 lizard data1 data2

我有一个列表<代码>[‘狗’、‘猫’、‘蛇’、‘蜥蜴’]。我想使用此列表从文本文件中提取行。我的文本文件以制表符分隔,每行末尾都有新行字符。每行有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)

我能够创建我想要写入的文本文件,但没有写入任何文件。我没有收到任何错误消息。最后,我希望能够为我感兴趣的每一行提取部分数据列,并将其放入我的新文本文件中。

如果您试图将列表直接写入文件(在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
>>> 
或者(这就是我要做的)您可以扫描
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)

尝试将列表直接写入文件时应该会出现错误(在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
>>> 
或者(这就是我要做的)您可以扫描
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)

这是更新的代码

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()
  • 您需要在g.write()中添加str(row),因为您无法写入数组 到文本文件
  • 重新打开“data.txt”似乎可以解决您无法写入文件的问题(不太清楚原因,尽管编辑:哦,这就是原因:)

  • 这是更新的代码

    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()
    
  • 您需要在g.write()中添加str(row),因为您无法写入数组 到文本文件
  • 重新打开“data.txt”似乎可以解决您无法写入文件的问题(不太清楚原因,尽管编辑:哦,这就是原因:)

  • 此解决方案仍然为我提供空文本文件。此解决方案仍然为我提供空文本文件。