2017-12-17 2 views
1

저는 파이썬 (2 주)을 처음 사용합니다. 저는 Coursera에서 Python for Everybody 과정을하고 있습니다. 몇 가지 아이디어를 내가 쓰고 싶은 앱으로 확장하기로 결정했습니다.파이썬 3에서 파일을 열고, 다시 포맷하고, 새로운 파일에 씁니다.

따옴표를 쓰는 불필요한 문자와 줄 바꿈을 제거한 다음 새로 서식이 지정된 문자열을 새 파일에 쓰고 싶습니다. 이 파일은 터미널에 임의의 따옴표를 표시하는 데 사용됩니다 (후자는 여기서는 필요하지 않습니다).

txt 파일의 항목은 다음과 같습니다

“The road to hell is paved with works-in-progress.” 
—Philip Roth, WD some other stuff here 
“Some other quote.” 
—Another Author, Blah blah 

그리고 나는 새 파일에 기록하려면 다음 싶습니다

"The road to hell is paved with works-in-progress." —Phillip Roth 
"Some other quote." —Another Author 

내가 줄 바꿈을 제거하고 싶습니다 견적과 저자 사이에 공백으로 대체하십시오. 필자는 이후에 쉼표에서 모든 것을 제거하고 싶다. (그래서 단지 인용문이다.) 파일에는이 중 73 개가 있으므로 이러한 변경을 수행하는 파일을 실행 한 다음 새로 서식이 지정된 따옴표로 새 파일에 쓰고 싶습니다.

나는 여러 가지 접근법을 시도해 왔으며, 현재 for 루프에서 두 개의 세그먼트를 작성하여 목록에 합류 할 생각이있는 곳으로 파일을 만들고있다. . 그러나 나는 이것이 고생이라면 막히고 또한 확신 할 수 없다. 어떤 도움이라도 감사하게 받아 들여질 것입니다. 이제는 두 개의 목록이 있는데 나는 그 목록에 참여할 수없는 것처럼 보입니다. 이렇게하는 것이 옳은 것인지 확실하지 않습니다. 이견있는 사람? 지금까지

코드 : 당신이 라인에 하나의 쉼표가 있다는 것을 확실하지 않은 경우

fh = open('quotes_source.txt') 


quote = list() 
author = list() 

for line in fh: 

    # Find quote segment and assign to a string variable 
    if line.startswith('“'): 
     phrase_end = line.find('”')+1 
     phrase_start = line.find('“') 
     phrase = line[phrase_start:phrase_end] 
     quote.append(phrase) 

    # Find author segment and assign to a string variable 
    if line.startswith('—'): 
     name_end = line.find(',') 
     name = line[:name_end] 
     author.append(name) 

print(quote) 
print(author) 
+1

정규 표현식을! – ForceBru

+0

내장 된 zip을 사용하여 두 목록을 함께 연결할 수 있습니다. – quamrana

+0

또한 phrase_end의 계산이 정확합니까? – quamrana

답변

1

당신은 간단한 작업을위한 정규식이 필요하지 않습니다 이처럼 실제로 옳은 길을 가고 있었지만 파일을 스트리밍하고 잘라낼 위치를 결정하는 대신 모든 것을 파싱하려고 노력했습니다.

데이터에 기초하여 (작성자 표시)으로 시작하는 줄을 자르고 첫 번째 쉼표에서 그 줄을 자르고 싶습니다. 아마도 빈 줄도 제거하고 싶을 것입니다. 따라서 간단한 스트림 수정자는 다음과 같이 표시됩니다.

# open quotes_source.txt for reading and quotes_processed.txt for writing 
with open("quotes_source.txt", "r", encoding="utf-8") as f_in,\ 
     open("quotes_processed.txt", "w", encoding="utf-8") as f_out: 
    for line in f_in: # read the input file line by line 
     line = line.strip() # clear out all whitespace, including the new line 
     if not line: # ignore blank lines 
      continue 
     if line[0] == "—": # we found the dash! 
      # write space, everything up to the first comma and a new line in the end 
      f_out.write(" " + line.split(",", 1)[0] + "\n") 
     else: 
      f_out.write(line) # a quote line, write it immediately 

그리고 그게 전부입니다. 데이터에 다른 새로운 행이 없으면 원하는 결과를 정확하게 생성합니다. 즉,포함 된 quotes_source.txt 파일 :

“The road to hell is paved with works-in-progress.” 
—Philip Roth, WD some other stuff here 

“The only thing necessary for the triumph of evil is for good men to do nothing.” 
—Edmund Burke, whatever there is 

“You know nothing John Snow.” 
—The wildling Ygritte, "A Dance With Dragons" - George R.R. Martin

그것은 포함하는 quotes_processed.txt 파일을 생성합니다 : 구출

“The road to hell is paved with works-in-progress.” —Philip Roth 
“The only thing necessary for the triumph of evil is for good men to do nothing.” —Edmund Burke 
“You know nothing John Snow.” —The wildling Ygritte
+0

이것은 아주 좋습니다. 완벽하게 작동합니다, 감사합니다! 나는 그 논리에 대해 머리를 써야한다. newb가 때때로 코드 뒤에 어떤 일이 일어나는지 개념화하는 것은 어렵습니다. – Stark2k

1
quote_line="“The road to hell is paved with works-in-progress.”\n—Philip Roth, WD some other stuff here\n" 
quote_line=quote_line.replace("\n","") 
quote_line=quote_line.split(",") 

formatted_quote="" 

.

  • "문신에 대한 짹입니다."\ n 형 누군가 로스, 어쩌구 \ n # 위 한 쉼표
  • "문신에 대한 가슴, 가슴에 문신"\ n 형 누군가 로스, 어쩌구 \ n 개의 # 하나 이상의 쉼표

    len_quote_list=len(quote_line)-1 
    for part in range(0,len_quote_list): 
        formatted_quote+=quote_line[part] 
    formatted_quote+="\n" 
    

또는

formatted_quote=quote_line[0]+"\n" 
+0

제안을 주셔서 감사합니다. @imox, 그것은 내가 찾던 내용이 아닙니다. 그래도 고맙습니다. :) – Stark2k

관련 문제