2009-02-03 8 views
15

J'aimerais pouvoir remplacer certains octets à un décalage donné dans un fichier en utilisant Python.Comment remplacer certains octets au milieu d'un fichier avec Python?

Mes tentatives ont lamentablement échoué et a abouti à:

  • écraser les octets à l'offset, mais aussi tronquer le fichier juste après (mode file = "w" ou "w +")
  • annexant les octets à la fin du fichier (mode fichier = "a" ou "a +")

Est-il possible de réaliser cela avec Python de manière portable?

+0

C'est un double de http://stackoverflow.com/questions/125703/how-do-i-modify-a-text-f ile-in-python – Kena

+0

Pas vraiment, celui que vous liez est sur * l'insertion * de données et le mien consiste à * remplacer * les données existantes en place (sans réécrire tout le contenu du fichier). – sebastien

+0

utiliser un module appelé mmap est la solution pour vous. lire ceci: http://stackoverflow.com/questions/125703/how-do-i-modify-a-text-file-in-python –

Répondre

4

Selon this python page, vous pouvez taper file.seek pour rechercher un décalage particulier. Vous pouvez alors écrire ce que vous voulez.

Pour éviter de tronquer le fichier, vous pouvez l'ouvrir avec "a +" puis rechercher le décalage correct.

+0

agréable. Bon à savoir –

+0

Le testera dès que possible, ths – sebastien

+2

Non, la réponse est l'ouverture avec "r + b" (binaire puisque nous voulons remplacer les octets). Un "man 3 fopen", section DESCRIPTION devrait expliquer la différence entre les modes disponibles. – tzot

26

Essayez ceci:

fh = open("filename.ext", "r+b") 
fh.seek(offset) 
fh.write(bytes) 
fh.close() 
+0

Je confirme que cela semble fonctionner (mais pas nécessairement avec d'autres modes de fichiers que r +) – Kena

+0

va le tester ASAP, thks – sebastien

+1

@Kena - Le mode "r +" signifie spécifiquement pour ouvrir le fichier pour (lecture et) écriture, laissez le "pointeur" au début du fichier, et ne pas tronquer. Le mode «a +» devrait également fonctionner pour cela, car nous utilisons de toute façon la recherche, mais pas d'autres modes. –

0

Très inefficace, mais je ne sais pas d'une autre façon en ce moment, que ne remplace pas les octets au milieu (comme Ben Blanks un fait):

a=file('/tmp/test123','r+') 
s=a.read() 
a.seek(0) 
a.write(s[:3]+'xxx'+s[3:]) 
a.close() 

rédigera 'xxx' à l'offset 3: 123456789 --> 123xxx456789

+1

Étant donné que l'OP a demandé comment remplacer les octets, je pense que l'écrasement des octets n'est pas réellement un problème. –

+0

Bien sûr? citation: Mes tentatives ont échoué lamentablement et ont [...] résulté soit en écrasant les octets à un décalage donné [...] –

+2

@Johannes Weiß - Vous avez coupé cette citation juste avant la bonne partie. Il déplore la troncature, pas l'écrasement. –

Questions connexes