2017-10-20 5 views
0

두 섹션으로 작성한 프로그램이 있습니다.UTF8이 아닌 Python3을 사용하여 ASCII 파일로 파일을 작성하십시오.

첫 번째 파일 이름의 중간에 정수가있는 텍스트 파일을이 형식으로 복사합니다.

file = "Filename" + "str(int)" + ".txt" 

사용자는 원하는 수의 파일을 만들 수 있습니다.

프로그램의 두 번째 부분은 내가 문제가있는 부분입니다. 파일 이름의 정수와 일치하는 정수가 파일의 맨 아래에 있습니다. 첫 번째 부분을 마친 후에는 각 파일을 한 번에 하나씩 열고 읽기/쓰기 형식 인 "r+"으로 엽니 다. 그래서 나는 file.seek(1000)에 정수가 파일에 어디에 있는지를 알릴 수 있습니다.

내 의견으로는 다음 부분이 쉬워야합니다. 그냥 str (int)을 여기 파일에 써야합니다. 그러나 그렇게 쉬운 것은 아니었다. 그것은 가정에서 리눅스처럼 잘 작동했지만, Windows에서는 어렵다고 판명되었습니다. file.seek(1000) 이후에해야 할 일은 유니 코드 UTF-8을 사용하여 파일에 쓰는 것입니다. 이 프로그램의 나머지 부분에 대한 코드 스 니펫으로이 작업을 수행했습니다. 무슨 일이 일어나고 있는지 이해할 수 있도록 문서화하겠습니다. 이것을 유니 코드로 작성하는 대신, 오래된 영어 ASCII 문자로 작성하는 것이 좋을 것입니다. 결국이 프로그램은 각 파일 맨 아래에 더 많은 데이터를 포함하도록 확장 될 것입니다. 유니 코드로 데이터를 작성하는 것은 일을 매우 어렵게 만듭니다. 데이터를 유니 코드로 변환하지 않고 작성하면 이것이 결과입니다. 이 문자열은 #2 =1534라고되어 있는데, 그 대신에 #2 =ㄠ㌵433.

누군가가 나에게 내가 뭘 잘못하고 있는지 보여줄 수 있다면 좋을 것입니다. 나는 단지 file.write('1534') 같은 것을 유니 코드 UTF-8로하지 않고 파일에 쓰는 것을 좋아할 것입니다.

while a1 < d1 : 
    file = "file" + str(a1) + ".par" 
    f = open(file, "r+") 
    f.seek(1011) 
    data = f.read() #reads the data from that point in the file into a variable. 
    numList= list(str(a1)) # "a1" is the integer in the file name. I had to turn the integer into a list to accomplish the next task. 
    replaceData = '\x00' + numList[0] + '\x00' + numList[1] + '\x00' + numList[2] + '\x00' + numList[3] + '\x00' #This line turns the integer into Utf 8 Unicode. I am by no means a Unicode expert. 
    currentData = data #probably didn't need to be done now that I'm looking at this. 
    data = data.replace(currentData, replaceData) #replaces the Utf 8 string in the "data" variable with the new Utf 8 string in "replaceData." 
    f.seek(1011) # Return to where I need to be in the file to write the data. 
    f.write(data) # Write the new Unicode data to the file 
    f.close() #close the file 
    f.close() #make sure the file is closed (sometimes it seems that this fails in Windows.) 
    a1 += 1 #advances the integer, and then return to the top of the loop 
+0

UTF-8이 아닙니다. UTF-16BE와 비슷합니다. –

+0

좋아, 나는 나 자신을 확신하지 못했다. 수정 해줘서 고마워. 나는 유니 코드에 익숙하지 않다. 기본적으로 이전 문자열과 동일한 형식으로 새 문자열을 만들었지 만 다른 번호를 사용했습니다. – CigEmacs

답변

1

이것은 ASCII 파일로 작성한 예입니다. 바이트 모드로 파일을 열어야하고 문자열에 .encode 메서드를 사용하면 원하는 최종 결과를 얻을 수있는 편리한 방법입니다.

s = '12345' 
ascii = s.encode('ascii') 
with open('somefile', 'wb') as f: 
    f.write(ascii) 

파일이 이미있는 경우 분명히 rb + (읽기 및 쓰기 바이트 모드)로 열 수도 있습니다.

with open('somefile', 'rb+') as f: 
    existing = f.read() 
    f.write(b'ascii without encoding!') 

b 접두사가있는 문자열 리터럴을 전달할 수도 있으며 두 번째 예와 같이 ascii로 인코딩됩니다.

+0

감사합니다. 나는 그것을 시도 할 것이다. 읽기/쓰기로 파일을 열려면 "open ('somefile', 'r + b')"이 맞을까요? – CigEmacs

+0

@CigEmacs 수정 사항을 확인하십시오. 다행히 도울 수있어. – Evan

+0

@CigEmacs 제 대답이 당신의 문제에 대한 해결책이라면, 당신이 받아 들인 대답으로 표시 할 수 있다면 정말 고맙겠습니다. – Evan