2017-10-20 23 views
0

J'ai un programme que j'ai créé avec deux sections.Écrire dans des fichiers ASCII avec Python3, pas UTF8

La première copie un fichier texte avec un entier au milieu du nom de fichier dans ce format.

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

l'utilisateur peut créer autant de copies du fichier qu'il le souhaite.

La deuxième partie du programme est ce que j'ai le problème avec. Il y a un entier en bas du fichier qui doit correspondre à l'entier dans le nom du fichier. Une fois la première partie terminée, j'ouvre chaque fichier un à la fois au format "r+" en lecture/écriture. Donc, je peux file.seek(1000) à peu près où l'entier est dans le fichier.

Maintenant, à mon avis, la prochaine partie devrait être facile. Je devrais simplement écrire str (int) dans le fichier ici. Mais ce n'était pas si facile. Cela a très bien fonctionné comme ça chez Linux à la maison, mais au travail sous Windows, ça s'est avéré difficile. Ce que j'ai fini par faire après file.seek(1000) est d'écrire dans le fichier en utilisant Unicode UTF-8. J'ai accompli ceci avec cet extrait de code du reste du programme. Je vais le documenter afin qu'il soit compris ce qui se passe. Au lieu d'avoir à écrire ceci en Unicode, j'aimerais pouvoir écrire ceci dans de bons vieux caractères ASCII anglais réguliers. Finalement, ce programme sera étendu pour inclure beaucoup plus de données au bas de chaque fichier. Avoir à écrire les données en Unicode va rendre les choses extrêmement difficiles. Si j'écris simplement les données sans les transformer en Unicode c'est le résultat. Cette chaîne est censée dire #2 =1534, à la place il est dit #2 =ㄠ㌵433.

Si quelqu'un peut me montrer ce que je fais de mal ce serait génial. J'aimerais utiliser quelque chose comme file.write('1534') pour écrire les données dans le fichier au lieu d'avoir à le faire en Unicode 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

Ce n'est pas UTF-8. Cela ressemble plus à UTF-16BE. –

+0

D'accord, je n'étais pas sûr moi-même. Merci pour la correction. Je ne suis pas si familier avec Unicode. J'ai simplement fait la nouvelle chaîne dans le même format que l'ancienne, mais avec un nombre différent. – CigEmacs

Répondre

1

Ceci est un exemple d'écriture dans un fichier en ASCII. Vous devez ouvrir le fichier en mode octet et utiliser la méthode .encode pour les chaînes est un moyen pratique d'obtenir le résultat final souhaité.

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

Vous pouvez évidemment aussi ouvert rb + (lecture et écriture en mode octet) dans votre cas si le fichier existe déjà.

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

Vous pouvez également passer juste littéraux de chaîne avec le préfixe b, et ils seront codés avec ascii comme indiqué dans le second exemple.

+0

Merci. Je vais essayer. Si je voulais ouvrir le fichier en lecture/écriture, il serait "open ('somefile', 'r + b')" correct? – CigEmacs

+0

@CigEmacs Vérifier mes modifications. Heureux d'avoir pu aider. – Evan

+0

@CigEmacs Si ma réponse était la solution à votre problème, j'apprécierais vraiment que vous puissiez le marquer comme la réponse acceptée. – Evan