복붙노트

[PYTHON] 작성 줄은 줄 바꿈없이 줄을 긋고 파일을 채 웁니다.

PYTHON

작성 줄은 줄 바꿈없이 줄을 긋고 파일을 채 웁니다.

나는 파일에 목록을 쓰는 프로그램을 가지고있다. 목록은 파이프 구분선의 목록이며 다음과 같이 파일에 줄을 써야합니다.

123|GSV|Weather_Mean|hello|joe|43.45
122|GEV|temp_Mean|hello|joe|23.45
124|GSI|Weather_Mean|hello|Mike|47.45

하지만 그것들은이 줄을 썼다. 아.

123|GSV|Weather_Mean|hello|joe|43.45122|GEV|temp_Mean|hello|joe|23.45124|GSI|Weather_Mean|hello|Mike|47.45

이 프로그램은 줄 바꿈없이 모든 줄을 줄 바꿈없이 썼습니다. 이것은 많이 나에게 상처를줍니다. 어쨌든 이것을 뒤집을 방법을 알아 내야합니다. 여기서 내 프로그램은 어디에서 잘못 되었습니까? 필자는 쓰기 라인이 모든 것을 한 줄에 쓰지 않고 파일 아래로 줄을 써야한다고 생각했습니다.

fr = open(sys.argv[1], 'r') # source file
fw = open(sys.argv[2]+"/masked_"+sys.argv[1], 'w') # Target Directory Location

for line in fr:
    line = line.strip()
    if line == "":
        continue
    columns = line.strip().split('|')
    if columns[0].find("@") > 1:
        looking_for = columns[0] # this is what we need to search
    else:
        looking_for = "Dummy@dummy.com"
    if looking_for in d:
        # by default, iterating over a dictionary will return keys
            new_line = d[looking_for]+'|'+'|'.join(columns[1:])
            line_list.append(new_line)
    else:
        new_idx = str(len(d)+1)
        d[looking_for] = new_idx
        kv = open(sys.argv[3], 'a')
        kv.write(looking_for+" "+new_idx+'\n')
        kv.close()
        new_line = d[looking_for]+'|'+'|'.join(columns[1:])
        line_list.append(new_line)
fw.writelines(line_list)

해결법

  1. ==============================

    1.이것은 실제로 파이썬을 처음 접하는 사람들에게 꽤 흔한 문제입니다. 특히 표준 라이브러리와 인기있는 써드 파티 라이브러리에서 일부 읽기 기능은 개행을 제거하지만 로그 기능과 관련없는 쓰기 기능은 거의 추가되지 않습니다.

    이것은 실제로 파이썬을 처음 접하는 사람들에게 꽤 흔한 문제입니다. 특히 표준 라이브러리와 인기있는 써드 파티 라이브러리에서 일부 읽기 기능은 개행을 제거하지만 로그 기능과 관련없는 쓰기 기능은 거의 추가되지 않습니다.

    그래서 파이썬 코드가 많이 있습니다.

    fw.write('\n'.join(line_list) + '\n')
    

    또는

    fw.write(line + '\n' for line in line_list)
    

    둘 중 하나는 정확하고, 물론 당신은 자신의 writelinesWithNewlines 함수를 작성할 수도 있습니다 ...

    그러나 피할 수없는 경우에만이 작업을 수행해야합니다.

    그렉 휴지 힐 (Greg Hewgill)의 제안에서와 같이 처음부터 개 라인을 만들거나 유지할 수 있다면 더 좋습니다.

    line_list.append(new_line + "\n")
    

    또한 esuaro에서 제시하는 것처럼 표준 라이브러리에서 csv 모듈을 사용하여 원시 텍스트 줄보다 높은 수준에서 작업 할 수 있다면 더 좋습니다.

    예를 들어 fw를 정의한 직후 다음과 같이 할 수 있습니다.

    cw = csv.writer(fw, delimiter='|')
    

    그런 다음이 대신 :

    new_line = d[looking_for]+'|'+'|'.join(columns[1:])
    line_list.append(new_line)
    

    너는 이렇게한다 :

    row_list.append(d[looking_for] + columns[1:])
    

    그리고 결국, 이것 대신에 :

    fw.writelines(line_list)
    

    너는 이렇게한다 :

    cw.writerows(row_list)
    

    마지막으로 디자인은 "파일을 연 다음 파일에 추가 할 줄 목록을 작성한 다음 한 번에 모두 작성"합니다. 위로 파일을 열려면 줄을 하나씩 작성하는 것이 가장 좋은 이유는 무엇입니까? 간단한 글쓰기 또는 csv.writer를 사용하든, 그것은 당신의 삶을 더 단순하게 만들고, 코드를 읽기 쉽게 만듭니다. (때로는 파일을 한 번에 쓸 수있는 단순성, 효율성 또는 정확성의 이유가있을 수 있지만, 일단 프로그램의 반대쪽 끝까지 열어 본 후에는 어떤 이점도 상실합니다 all-at-once.)

  2. ==============================

    2.writelines () 상태에 대한 설명서 :

    writelines () 상태에 대한 설명서 :

    따라서 직접 추가해야합니다. 예 :

        line_list.append(new_line + "\n")
    

    line_list에 새 항목을 추가 할 때마다.

  3. ==============================

    3.writelines ()는 줄 구분 기호를 추가하지 않습니다. map ()을 사용하여 각 문자열 끝에 새로운 \ n (줄 바꿈)을 추가하여 문자열 목록을 변경할 수 있습니다.

    writelines ()는 줄 구분 기호를 추가하지 않습니다. map ()을 사용하여 각 문자열 끝에 새로운 \ n (줄 바꿈)을 추가하여 문자열 목록을 변경할 수 있습니다.

    items = ['abc', '123', '!@#']
    items = map(lambda x: x + '\n', items)
    w.writelines(items)
    
  4. ==============================

    4.다른 사람들이 언급했듯이, 메소드 이름이 암시하는 것과 반대되는 경우, 줄거리는 라인 구분자를 추가하지 않습니다. 이것은 발전기에 대한 교과서의 경우입니다. 다음은 인위적인 예제입니다.

    다른 사람들이 언급했듯이, 메소드 이름이 암시하는 것과 반대되는 경우, 줄거리는 라인 구분자를 추가하지 않습니다. 이것은 발전기에 대한 교과서의 경우입니다. 다음은 인위적인 예제입니다.

    def item_generator(things):
        for item in things:
            yield item
            yield '\n'
    
    def write_things_to_file(things):
        with open('path_to_file.txt', 'wb') as f:
            f.writelines(item_generator(things))
    

    이점 : 입력 또는 출력 값을 수정하거나 지저분한 문자열 연결을 수행하지 않고도 개행을 명시 적으로 추가합니다. 그리고 비판적으로 메모리에 새로운 데이터 구조를 만들지는 않습니다. IO (파일 쓰기)는 그런 종류의 것이 실제로 중요한 경향이있는 경우입니다. 희망이 사람을 돕는다!

  5. ==============================

    5.다른 사람들이 언급했듯이, 작성 라인은 잘못된 이름입니다 (이는 각 라인의 끝 부분에 줄 바꿈 문자를 추가하지 않습니다).

    다른 사람들이 언급했듯이, 작성 라인은 잘못된 이름입니다 (이는 각 라인의 끝 부분에 줄 바꿈 문자를 추가하지 않습니다).

    그렇게하려면지도를 사용하십시오.

    with open(dst_filename, 'w') as f:
        f.writelines(map(lambda s: s + '\n', lines))
    
  6. ==============================

    6.R에있는 파일에 글을 쓸 때 비슷한 문제를 해결하려고 할 때이 스레드에서 끝내기까지했습니다. 따라서 동일한 문제가있는 사람들은 다음과 같습니다.

    R에있는 파일에 글을 쓸 때 비슷한 문제를 해결하려고 할 때이 스레드에서 끝내기까지했습니다. 따라서 동일한 문제가있는 사람들은 다음과 같습니다.

    List_To_Be_Written_To_File<-sprintf("%s%s",as.character(List_To_Be_Written_To_File),"\n")
    
  7. from https://stackoverflow.com/questions/13730107/writelines-writes-lines-without-newline-just-fills-the-file by cc-by-sa and MIT license