2017-11-21 1 views
-1

코드를 계속 수행하는 방법에 대해 의구심이 있습니다. 폴더에서 모든 파일을 가져 와서 다른 텍스트 형식으로 파일 하나에 병합해야합니다.폴더에 txt 파일을 병합하고 파이썬에서 문자를 바꾸기

예 :

입 파일

이 같은 텍스트 형식의 위치 :

"3173391045","27/09/2017" 
"2173391295","05/01/2017" 
"5173351035","07/03/2017" 

이 내 작업 코드는, 그것의된다

"{'nr': '3173391045', 'data': '27/12/2017'}" 
"{'nr': '2173391295', 'data': '05/01/2017'}" 
"{'nr': '5173351035', 'data': '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()) 
,363,210

내가 당신의 입력 파일이 유효한 JSON 문자열을 포함했다면 내가 구문 오류 또는 빈 파일

filedata = filedata.replace("{", "") for line in filedata 
+2

사용'JSON : 당신은 항상

그리고이 경우

, 경우에도 json는 어떠한 수정없이 ast.literal_eval 캔을 그 라인을 읽을 수 없습니다 .. 구분 기호, 쉼표 등을 포함하는 데이터에 우연히 발견 할 수 .loads'는 입력 문자열을 슬프게 구문 분석하는 대신 사전에 각 행을 읽습니다. –

+0

@ Jean-FrançoisFabre : 불행히도, 선은 유효한 json 형식이 아닙니다. 문자열은 작은 따옴표로 묶고 json은 큰 따옴표를 사용해야합니다 ... –

+1

thats the chalenge! –

답변

1

를 얻을 .replace 뭔가를 시도하고 있지만 작동하지 않는, 올바른 방법은 라인을 구문 분석했을 것이다 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()) 
+0

훌륭한 작품! 난 그냥 정규식 설명서에서 빈 줄을 꺼내하는 방법을 찾고 있어요. 대단히 감사합니다. @Serge Ballesta –

0

, 입력 데이터가 JSON 구문 분석에 적합한 형태로 강요 할 수 있습니다에,

"3173391045","27/12/2017" 
"2173391295","05/01/2017" 
"5173351035","07/03/2017" 

참고 :

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

당신에게주기 Python 3.x 출력 파일은 newline=''으로 열어야합니다. 이것이 없으면 여분의 공백 행이 출력 파일에 나타날 수 있습니다.

+0

왜 최종 결과는 빈 파일 @Martin Evans입니다. 그러나 aswer에 대한 감사합니다. –

+0

파일이 하위 폴더 인 경우에는 glob2 '. 스크립트를 업데이트했습니다. –

+0

역 추적 (마지막으로 가장 최근 통화) : 파일 "C : /Merging/pmerge.py", 라인 (13), csv_output.writerow ([row_dict [ 'NR', row_dict [ '데이터']]) 형식 오류에 : 'str'이 아닌 바이트와 같은 객체가 필요합니다. 종료 코드 1로 처리가 완료되었습니다. –

0

regex/replace를 사용하여 해당 문자열을 구문 분석하는 것은 위험합니다.

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']) 
관련 문제