2010-02-16 2 views
1

Je dispose d'un fichier contenant des données de txt comme ceci:problème avec le remplacement d'un mot dans un fichier, en utilisant Python

1,Rent1,Expense,16/02/2010,1,4000,4000 
1,Car Loan1,Expense,16/02/2010,2,4500,9000 
1,Flat Loan1,Expense,16/02/2010,2,4000,8000 
0,Rent2,Expense,16/02/2010,1,4000,4000 
0,Car Loan2,Expense,16/02/2010,2,4500,9000 
0,Flat Loan2,Expense,16/02/2010,2,4000,8000 

Je veux remplacer le premier élément. Si elle est de 1, signifie qu'il doit rester la même, mais si elle est 0 signifie que je veux changer à 1. J'ai donc essayé d'utiliser le code suivant:

import fileinput 
for line in fileinput.FileInput("sample.txt",inplace=1): 
    s=line.split(",") 
    print a 
    print ','.join(s) 

Mais après exécuté avec succès le programme de mon txt le fichier ressemble à:

1,Rent1,Expense,16/02/2010,1,4000,4000 

1,Car Loan1,Expense,16/02/2010,2,4500,9000 

1,Flat Loan1,Expense,16/02/2010,2,4000,8000 

0,Rent2,Expense,16/02/2010,1,4000,4000 

0,Car Loan2,Expense,16/02/2010,2,4500,9000 

0,Flat Loan2,Expense,16/02/2010,2,4000,8000 

Maintenant, je veux supprimer la ligne vide. Est-ce possible ou existe-t-il un autre moyen de remplacer les 0?

+2

similaires: http://stackoverflow.com/questions/2250357/replace-a-word-in-a-file – ghostdog74

Répondre

4

print ajoute une nouvelle ligne après l'entrée et vous y avez déjà une nouvelle ligne. Vous devez soit supprimer la nouvelle ligne existante (line.rstrip("\n")), soit utiliser sys.stdout.write() à la place.

1

Vous pouvez utiliser rstrip pour supprimer les nouvelles lignes avant l'impression ou utiliser sys.stdout.write au lieu de print.

De plus, si vous avez seulement besoin de modifier le premier élément, il n'est pas nécessaire de diviser la ligne entière et de la rejoindre à nouveau. Il vous suffit de diviser la première virgule:

line.split(',', 1) 

Si vous voulez encore de meilleures performances, vous pouvez également tester simplement directement la valeur de line[0].

2
import fileinput 
import re 
p = re.compile(r'^0,') 
for line in fileinput.FileInput("sample.txt",inplace=1): 
    print p.sub('1,', line.strip()) 

Le code existant que vous avez ne change pas réellement les lignes comme vous le souhaitez; print a ne fait rien si a n'est pas défini! Vous finissez donc par imprimer une ligne vide (le bit print a) et ensuite imprimer la ligne existante, d'où la raison pour laquelle vous obtenez un fichier qui n'est pas modifié, sauf pour l'ajout de lignes vides.

+0

+ 1: il suffit de remplacer 'print re.sub (r '^ 0,', '1,', line)' par 'print re.sub (r '^ 0,', '1,', line.strip()) ', qui va se débarrasser des lignes vides. – van

+0

Pas besoin de la bande en premier lieu; exécutez-le simplement sur le fichier d'origine à la place du fichier vide. – Amber

+0

avec Python26 sur Win32 si vous ne déposez pas() ou rstrip(), vous obtenez des lignes vides sur le fichier original – van

0
fixed = [] 
for l in file('sample.txt'): 
    parts = l.split(',',1) 
    if(parts[0] == '0'): 
     # not sure what you want to do here, but you want to "change this" number to 1? 
     parts[0] = 1 
    fixed.append(parts.join(',')) 
outp = file('sample.txt','w') 
for f in fixed: 
    outp.write(f) 
outp.close() 

Ceci n'a pas été testé, mais il devrait vous permettre d'y parvenir en grande partie. Bonne chance

0
import fileinput 
for line in fileinput.FileInput("sample.txt",inplace=1): 
    s=line.rstrip().split(",") 
    print a 
    print ','.join(s) 
0

Vous devez utiliser une virgule à la fin de votre print afin qu'il n'ajoute une nouvelle ligne. Comme si:

print "Hello", 

C'est ce que je suis venu avec:

input = open('file.txt', 'r') 
output = open('output.txt', 'w') 
for line in input: 
    values = line.split(',') 
    if (values[0] == '0'): 
     values[0] = '1' 
    output.write(','.join(values)) 

Si vous voulez une meilleure bibliothèque de gestion de csv vous pouvez utiliser this au lieu de Split.

0

La propre façon de le faire est d'utiliser l'analyseur CSV:

import fileinput 
import csv 

f = fileinput.FileInput("test.txt",inplace=1) 
fichiercsv = csv.reader(f, delimiter=',') 

for line in fichiercsv: 
    line[0] = "1" 
    print ",".join(line)