programing

Writeline은 새 줄 없이 줄을 씁니다. 파일만 채웁니다.

skycolor 2023. 9. 9. 09:16
반응형

Writeline은 새 줄 없이 줄을 씁니다. 파일만 채웁니다.

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

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)

Python을 에게 꽤 입니다. 있는 전반에 기능은 줄을 Python」의 경우는 ). 특히 표준 라이브러리와 인기 있는 타사 라이브러리 전반에 걸쳐 일부 읽기 기능은 새로운 줄을 제거하지만 쓰기 기능은 거의 없기 때문입니다(단,log-관련된 것) 추가합니다.

파이썬 코드는 다음과 같은 기능을 합니다.

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

(단일 문자열 쓰기) 또는

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

둘 중 하나가 맞으며, 물론 당신은 당신 자신의 글줄을 쓸 수도 있습니다.마무리하는 Newlines 기능으로…

하지만 피할 수 없을 때만 이렇게 해야 합니다.

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.open프로그램의 반대쪽 끝까지.write을 거의 하는 을 에 에 을 하는 )

주에 대한 설명서:

writelines()선 구분자를 추가하지 않음

따라서 직접 추가해야 합니다.예를 들어,

    line_list.append(new_line + "\n")

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

다른 사람들이 지적했듯이,writelines는 잘못된 이름입니다(각 줄의 끝에 새 줄을 추가하지 않음).

이렇게 하려면 각 줄에 명시적으로 추가합니다.

with open(dst_filename, 'w') as f:
    f.writelines(s + '\n' for s in lines)

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

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

크레딧:Brent Faust.


형식 문자열이 있는 Python >= 3.6:

with open(dst_filename, 'w') as f:
    f.writelines(f'{s}\n' for s in lines)

lines가 될 수 있습니다set.

만약 당신이 (나처럼) 오래된 학교라면 당신은 추가할 수 있습니다.f.write('\n')두 번째 선 아래에

다른 사람들이 언급한 바와 같이 메소드 이름이 의미하는 바와 반대됩니다.writelines는 선 구분자를 추가하지 않습니다.이것은 발전기의 교과서 케이스입니다.다음은 작위적인 예입니다.

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(파일에 쓰는 것)는 그러한 종류의 것이 실제로 중요한 경향이 있는 경우입니다.누군가에게 도움이 되길 바랍니다!

우리가 여기서 잘 자리잡았으니,writelines새 줄을 추가하지 않습니다.하지만, 모든 사람들이 놓치고 있는 것은, 그것이 직접적인 "상대"로 사용될 때는 그럴 필요가 없다는 것입니다.readlines()그리고 첫번째 읽기는 새로운 선들을 지속했습니다!

이진 모드에서 읽기 위해 파일을 열 때(다음을 통해)'rb'), 그런 다음 사용합니다.readlines()파일 내용을 메모리로 가져오려면 줄로 나누어 새 줄은 줄 끝에 붙어 있는 상태로 유지됩니다.그래서 나중에 답장을 쓴다면, 당신은 아마writelines무엇이든 덧붙일 수 있습니다!

그래서 만약 당신이 다음과 같은 일을 한다면,

with open('test.txt','rb') as f: lines=f.readlines()
with open('test.txt','wb') as f: f.writelines(lines)

당신은 당신이 처음에 했던 것과 같은 파일 내용으로 끝나야 합니다.

우리는 오직 선들만 분리하고 싶어 하고, 그리고.writelinespython의 function은 행 사이에 구분자를 추가하는 것을 지원하지 않습니다. 아래에 이 문제에 가장 적합한 간단한 코드를 적었습니다.

sep = "\n" # defining the separator
new_lines = sep.join(lines) # lines as an iterator containing line strings

그리고 마지막으로:

with open("file_name", 'w') as file:
    file.writelines(new_lines)

당신은 끝입니다.

언급URL : https://stackoverflow.com/questions/13730107/writelines-writes-lines-without-newline-just-fills-the-file

반응형