[英]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.