将复杂的 txt 转换为 csv python 脚本
Convert complex txt to csv python script
我有一个 .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
(table)。
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 做到这一点?谢谢。
您当前的示例表明所有值似乎都遵循相同的格式,即 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
文件,里面有这个
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
(table)。
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 做到这一点?谢谢。
您当前的示例表明所有值似乎都遵循相同的格式,即 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