簡體   English   中英

合並文件夾中的txt文件並替換python中的字符

[英]Merge txt files in a folder and replacing characters in python

我對如何繼續執行代碼有疑問,我需要從一個文件夾中提取所有文件,然后將它們合並為另一種文本格式的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

如果您的輸入文件包含有效的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())

通過一些調整,可以將輸入數據強制轉換為適合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=''打開輸出文件。 否則,多余的空行會出現在輸出文件中。

使用正則表達式/替換來解析那些字符串很危險。 您總是會偶然發現包含定界符,逗號等的數據。

在這種情況下,即使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'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM