【问题标题】:Convert complex txt to csv python script将复杂的txt转换为csv python脚本
【发布时间】:2021-05-29 15:22:51
【问题描述】:

我有一个.txt 文件,里面有这个

Name: 321; 
Score:100; Used Time: 1:09:308;
GTime: 6/28/2024 10:04:18 PM;
Core Version : 21.0.0.0;
Software Version : 21.0.0.0;
AppID: 0S0; MapDispName: Future City; MapName:MapName MapName MapName;
Key:A0000-abcde-Q0000-F0000-00H00;  REG Date : 2/27/2021 1:16:34 PM; Expiry : 7/7/2024 12:00:00 AM

我要做的是使用 python 脚本将该文本转换为.csv(表格)。 每个文件有 300 个文件和数百行。我们只需要将前7行的信息转换成csv即可。所有这 300 个文件都具有相同的格式但具有不同的值。

我希望 log.csv 文件显示的是:

Name,Sore,Time,Software Ver,Core Ver,AppID,Key,REG Date,Expiry,MapName
321,100,69.308s,21.0.0.0,21.0.0.0,0S0,A0000-abcde-Q0000-F0000-00H00,2/27/2021 1:16:34 PM,7/7/2024 12:00:00 AM,MapName MapName MapName

我怎样才能用 python 做到这一点?谢谢。

【问题讨论】:

  • 对于导出到 csv,您可以查看 python 的内置 CSV 库 (docs.python.org/3/library/csv.html)。为了解析输入文件,你必须想出一些自定义逻辑。你可以看看 ar 正则表达式,也许它们会有所帮助(regular-expressions.info
  • 您需要手动parse数据。如:name, line = line.split(':', 1),则score, line = line.strip().split('\t')
  • 您的 txt 文件中只有一个条目还是有多个?如果有多个,它们都是 3 行吗?条目之间是否有空行分隔?
  • 共有300个文件,每个文件数百行。我们只需要将前8行的信息转换成csv即可。所有这 300 个文件都具有相同的格式但具有不同的值。

标签: python database csv text export-to-csv


【解决方案1】:

您当前的示例显示所有值似乎都遵循相同的格式,即Key:Value;

使用glob.glob() 遍历所有文本文件名。您可以使用islice() 准确读取 7 行,然后将它们转换为单行。然后可以在 ; 上拆分它,为您提供键值对列表。然后可以在 :strip() 上进一步拆分它们以删除任何多余的空格。

最后使用itemgetter() 从结果列表中仅提取您需要的元素。

from itertools import islice, chain
from operator import itemgetter
import csv
import glob
import os

get = itemgetter(1, 3, 5, 9, 11, 13, 19, 21, 23, 17)

with open('log.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow('Name,Sore,Time,Software Ver,Core Ver,AppID,Key,REG Date,Expiry,Filename'.split(','))

    for filename in glob.glob('*.txt', recursive=True):
        with open(filename) as f_input:
            data = ''.join(islice(f_input, 0, 7)).replace('\n', '').split(';')
            values = [v.strip() for v in chain.from_iterable(d.split(':', 1) for d in data)]
            csv_output.writerow([*get(values), os.path.basename(filename)])

对于您的示例,这将为您提供 log.csv 包含:

Name,Sore,Time,Software Ver,Core Ver,AppID,Key,REG Date,Expiry,Filename
321,100,1:09:308,21.0.0.0,21.0.0.0,0S0,A0000-abcde-Q0000-F0000-00H00,2/27/2021 1:16:34 PM,7/7/2024 12:00:00 AM,MapName MapName MapName,file1.txt

【讨论】:

  • 谢谢,马丁。代码有效!!!同时,如果我想将 txt 文件的名称保留在 log.csv 的另一列中,我应该怎么做?非常感谢
  • 是的,文件名可以很容易地添加到每一行的末尾(或前缀),我已经更新了脚本来告诉你如何
  • 嗨,马丁。我已经更新了我的问题。能否请教一下我该怎么办,谢谢。 stackoverflow.com/questions/66461035/…
猜你喜欢
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 2019-12-11
相关资源
最近更新 更多