2017-05-20 1 views
2

약 20 개 항목이있는 텍스트 파일이 있습니다. 그들은 다음과 같이 :파이썬에서 줄 바꿈 텍스트 파일 구문 분석

~ 

England 
Link: http://imgur.com/foobar.jpg 
Capital: London 
~ 
Iceland 
Link: http://imgur.com/foobar2.jpg 
Capital: Reykjavik 
... 

나는 이러한 항목을하고 CSV로를 설정하고 싶습니다. 각 항목을 구분하는 '~'이 있습니다. 나는 줄을 서서 지나가고 각 나라의 CSV 값을 만드는 방법을 알아 내려고 노력하면서 머리를 긁적니다. 아무도 나에게 이것에 대해 갈 방법에 대한 단서를 줄 수 있습니까?

f = open('NameOfFile.extensionType', 'a+') 

"는이 +"모드를 추가이다 : 나는 그렇게 할 것

+0

원하는 최종 출력물의 예를 제공 할 수 있습니까? – lukess

+0

파일에서 줄 단위로 이동하고 '/ n'(파일 내용 저장 용)으로 분할을 적용하고 '~'을 확인하십시오. – Aditya

답변

-1
import csv 

datafile = 'unparsed_countries.txt' 
new_file = 'parsed_countries.csv' 
with open(datafile, 'r') as f: 
    data = [] 
    country = [] 

    for line in f: 
     line = line.strip() 
     if line == '~': 
      data.append(country) 
      country = [] 
     else: 
      country.append(line) 

with open(new_file, 'w', newline='\n') as myfile: 
    wr = csv.writer(myfile, lineterminator='\n', delimiter=',') 
    wr.writerows(data) 



Output file: 

England,Link: http://imgur.com/foobar.jpg,Capital: London 
Iceland,Link: http://imgur.com/foobar2.jpg,Capital: Reykjavik 
England,Link: http://imgur.com/foobar.jpg,Capital: London 
Iceland,Link: http://imgur.com/foobar2.jpg,Capital: Reykjavik 
0

방법은의 구문을 사용하여 오픈() 함수를 사용하는 것입니다. 파일을 덮어 쓰지 않고 새 데이터를 추가 할 수 있습니다. 또한 "r +"를 사용하여 읽기 모드에서 파일을 열 수는 있지만 편집 할 수있는 능력은 상실됩니다. 편지 뒤의 "+"는 해당 문서가 존재하지 않으면 해당 문서가 작성됨을 의미합니다. "+"없이는 작동하지 않는 "a +".

data = [] 
tmp = [] 
for line in f: 
    line.strip() #Removes formatting marks made by python 
    if line == '~': 
    data.append(tmp) 
    tmp = [] 
    continue 
    else: 
    tmp.append(line) 

지금 당신이 목록에 저장된 모든 데이터를 가지고 있지만, 당신은 또한 약간 다른 알고리즘을 사용하여 클래스 개체로 다시 포맷 수 :

그 후 나는 다음과 같은 루프를 사용합니다.

나는 파이썬을 사용하여 CSV 파일을 편집 한 적이없는,하지만 난 당신이 데이터를 추가하려면이 같은 루프를 사용할 수 있다고 생각 : 그 루프의 모든 단일 열을 만들 것입니다 CSV의 내 지식에서

f2 = open('CSVfileName.csv', 'w') #Can change "w" for other needs i.e "a+" 
for entry in data: 
    for subentry in entry: 
    f2.write(str(subentry) + '\n') #Use '\n' to create a new line 

을 자료. 마지막에 변경 사항을 저장하기 위해 파일을 닫습니다 기억

f.close() 
f2.close() 

당신은 공간을 절약하기 위해 하나에 두 개의 루프를 결합 할 수 있지만, 설명을 위해 내가하지 않았습니다.

3

라이브러리 사용 luke :) 데이터 형식이 올바른 것으로 가정합니다. 대부분의 실제 데이터는 그런식이 아닙니다. 그래서 여기에 해결책이 있습니다.

>>> content.split('~') 
['\nEngland\nLink: http://imgur.com/foobar.jpg\nCapital: London\n', '\nIceland\nLink: http://imgur.com/foobar2.jpg\nCapital: Reykjavik\n', '\nEngland\nLink: http://imgur.com/foobar.jpg\nCapital: London\n', '\nIceland\nLink: http://imgur.com/foobar2.jpg\nCapital: Reykjavik\n'] 

파이썬에는 CSV를 작성하는 데 표준 라이브러리 기능이 있습니다.

>>> import csv 
>>> csvfile = open('foo.csv', 'wb') 
>>> fieldnames = ['Country', 'Link', 'Capital'] 
>>> writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 
>>> for entry in entries: 
... cols = entry.strip().splitlines() 
... writer.writerow({'Country': cols[0], 'Link':cols[1].split(': ')[1], 'Capital':cols[2].split(':')[1]}) 
... 

데이터가 반 구조화되거나 잘못 포맷 된 경우 PyParsing과 같은 라이브러리를 사용하는 것이 좋습니다.

편집 : 두 번째 열에는 URL이 포함되어 있으므로 분할을 잘 처리해야합니다.

>>> cols[1] 
'Link: http://imgur.com/foobar2.jpg' 
>>> cols[1].split(':')[1] 
' http' 
>>> cols[1].split(': ')[1] 
'http://imgur.com/foobar2.jpg'