我对如何继续代码感到怀疑,我需要从文件夹中获取所有文件并将它们合并到另一种文本格式的1个文件中。
示例:
输入文件的文本格式如下:
"{'nr': '3173391045', 'data': '27/12/2017'}"
"{'nr': '2173391295', 'data': '05/01/2017'}"
"{'nr': '5173351035', 'data': '07/03/2017'}"
输出文件必须是这样的行:
"3173391045","27/09/2017"
"2173391295","05/01/2017"
"5173351035","07/03/2017"
这是我的工作代码,它正在合并并取出空行
import glob2
import datetime
filenames=glob2.glob("*.txt")
with open(datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S-%f")+".SAI", 'w') as file:
for filename in filenames:
with open(filename,"r") as f:
file.write(f.read())
我尝试使用.replace但是无法正常工作,我会收到语法错误或空白文件
filedata = filedata.replace("{", "") for line in filedata
答案 0 :(得分:1)
如果您的输入文件包含有效的JSON字符串,那么正确的方法是将行解析为JSON并将它们写回csv。由于字符串用单引号括起来('
),它们会被Python库的json模块拒绝,我的建议是使用正则表达式来解析它们。代码可能变成:
import glob2
import datetime
import csv
import re
# the regex to parse the line
rx = re.compile(r".*'nr'\s*:\s*'(\d+)'.*'data'\s*:\s*'([/\d]+)'")
filenames=glob2.glob("*.txt")
with open(datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S-%f")+".SAI", 'w') as file:
wr = csv.writer(file, quoting = csv.QUOTE_ALL)
for filename in filenames:
with open(filename,"r") as f:
for line in f: # process line by line
m = rx.match(line)
wr.writerow(m.groups())
答案 1 :(得分:0)
通过一些调整,输入数据可以强制转换为适合JSON解析的形式:
from datetime import datetime
import json
import glob2
import csv
with open(datetime.now().strftime("%Y-%m-%d-%H-%M-%S-%f")+".SAI", 'w', newline='') as f_output:
csv_output = csv.writer(f_output, quoting=csv.QUOTE_ALL)
for filename in glob2.glob('*.txt'):
with open(filename) as f_input:
for row in f_input:
row_dict = json.loads(row.strip('"\n').replace("'", '"'))
csv_output.writerow([row_dict['nr'], row_dict['data']])
给你:
"3173391045","27/12/2017"
"2173391295","05/01/2017"
"5173351035","07/03/2017"
注意,在Python 3.x中,应使用newline=''
打开输出文件。如果没有这个,输出文件中会出现额外的空行。
答案 2 :(得分:0)
使用正则表达式/替换来解析这些字符串是危险的。你总是偶然发现包含分隔符,逗号等的数据。
在这种情况下,即使json
无法读取这些行,ast.literal_eval
也可以不做任何修改:
import ast
with open("output.csv",newline="") as fw:
cw = csv.writer(fw)
for filename in filenames:
with open(filename) as f:
for line in f:
d = ast.literal_eval(line)
cw.writerow([d['nr'],d['data'])