合并文件夹中的txt文件并替换python中的字符

时间:2017-11-21 10:03:47

标签: python python-3.x merge io

我对如何继续代码感到怀疑,我需要从文件夹中获取所有文件并将它们合并到另一种文本格式的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

3 个答案:

答案 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'])