在python中将所选行导出到列表中

2024-04-25 01:12:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件,比如这个小例子:

小例子:

</Attributes>
ENDI,ERT,GFTR,29
ENDI,XCV,HGJ,36
TOC,FGNH,TRYCB,3742
TOC,MVCL,KJDSFH,38799
GOF,KLJG,XZCJV,31
GOF,LKBFV,JKSDHF,18

我想选择一些行并将第4列(这些行用逗号分隔)添加到python列表中。关键是所有的行都不是逗号分隔的,但是我感兴趣的行是逗号分隔的分开。这里是预期输出:

TOC = [3742, 38799]
GOF = [31, 18]

我用python编写了以下代码。但不返回预期输出。你知道怎么修吗?你知道吗

TOC = []
GOF = []
file = open('file.txt') as f:
    for line in file:
        if line.startswith("TOC"):
            TOC.append(line[3])
        if line.startswith("GOF"):
            GOF.append(line[3])

Tags: iflineattributes例子file逗号文本文件gof
3条回答
TOC = []
GOF = []
file_name = 'file.txt'

with open(file_name) as f:
    for line in f:
        if(line[0:3] == "TOC"):
            # Splits lines by commas
            line_parts = line.split(',')
            #Trims new line off wanted value.
            value = line_parts[3].replace('\n', '')
            TOC.append(value)
        elif(line[0:3] == "GOF"):
            # Splits lines by commas
            line_parts = line.split(',')
            #Trims new line off wanted value.
            value = line_parts[3].replace('\n', '')
            GOF.append(value)

print(TOC)
print(GOF)

这是我第一次张贴,所以我希望这有帮助。这会给你想要的结果。如果要将值存储为int,请替换目录附加(值)带目录附加(int(值))。你知道吗

您的解决方案无法正常工作的原因是,获取字符串(line[3])的索引位置会产生单个字符。要从逗号分隔的行中获取整个单词,需要split它,并指定逗号作为分隔符。你知道吗

Split返回一个或多个数组,因此现在当您获得索引值时,您将从数组中的该位置得到一个字符串,而不仅仅是一个字符。你知道吗

下面是一个替代实现,基于WebScrapingPancake的答案,使用列表字典。使用字典意味着你不需要知道这行的第一个单词是什么。你知道吗

import collections

totals = collections.defaultdict(list)
file_name = 'file.txt'

with open(file_name) as f:
    for line in f:
        line_parts = line.split(',')
        # Trims new line off wanted value.
        value = line_parts[3].replace('\n', '')
        totals[line_parts[0]].append(value)

print(totals)
print(totals['TOC'])
print(totals['GOF'])

输出:

defaultdict(<class 'list'>, {'ENDI': ['29', '36'], 'TOC': ['3742', '38799'], 'GOF': ['31', '18']})
['3742', '38799']
['31', '18']

缺点是必须过滤掉不需要的行,例如文件的第一行。但这是我留给你去解决的问题;)

使用CSV阅读器。它将有助于你在其他项目。你知道吗

TOC = []
GOF = []
with open('file.txt', newline='') as f:
    reader = csv.reader(f, delimiter=',')
    for line in reader:
        if len(line) == 1: # skip attribute tag
            continue
        if line[0] == "TOC":
            TOC.append(int(line[3]))
        if line[0] == "GOF":
            GOF.append(int(line[3]))
print("TOC = " + str(TOC))
print("GOF = " + str(GOF))

输出为:

TOC = [3742, 38799]
GOF = [31, 18]

从您的问题中,我假设您希望列表中的what是int,而不是字符串,这就是为什么值被包装在int()s中的原因

相关问题 更多 >