【问题标题】:Merge txt files in a folder and replacing characters in python合并文件夹中的txt文件并替换python中的字符
【发布时间】:2017-11-21 10:03:47
【问题描述】:

我对如何继续代码有疑问,我需要从一个文件夹中取出所有文件并将它们合并到一个文件中,并使用另一种文本格式。

例子:

输入文件的文本格式如下:

"{'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

【问题讨论】:

  • 使用json.loads 将每一行读入字典,而不是试图蹩脚地解析您的输入字符串。
  • @Jean-FrançoisFabre:不幸的是,行不是有效的 json 格式:字符串用单引号括起来,而 json 需要双引号......
  • 这就是挑战!

标签: python python-3.x datetime merge io


【解决方案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())

【讨论】:

  • 这个效果很好!我只是在寻找如何取出正则表达式文档中的空行。非常感谢@Serge Ballesta
【解决方案2】:

通过一些调整,可以将输入数据强制转换为适合 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='' 打开。没有这个,额外的空行会出现在输出文件中。

【讨论】:

  • 我不明白为什么,但最终结果是一个空文件@Martin Evans,但感谢您的回答
  • 如果您的文件是子文件夹,那么您将需要使用您的glob2。我已经更新了脚本。
  • 回溯(最近一次调用最后一次):文件“C:/Merging/pmerge.py”,第 13 行,在 csv_output.writerow([row_dict['nr'], row_dict[' data']]) TypeError:需要一个类似字节的对象,而不是'str'进程以退出代码1结束
  • 是的,我使用的是 3.6.3。
【解决方案3】:

使用正则表达式/替换来解析这些字符串是危险的。您总是会偶然发现包含分隔符、逗号等的数据。

在这种情况下,即使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'])

【讨论】:

    猜你喜欢
    • 2017-03-11
    • 2015-07-06
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多