Проблема с заменой слова в файле при использовании Python - PullRequest
1 голос
/ 16 февраля 2010

У меня есть файл .txt, содержащий такие данные:

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 

Я хочу заменить первый элемент. Если оно равно 1, значит, оно должно оставаться прежним, но если оно равно 0, я хочу изменить его на 1. Поэтому я попытался использовать следующий код:

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

Но после успешного выполнения программы мой .txt файл выглядит так:

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

Теперь я хочу удалить пустую строку. Возможно ли это, или есть какой-нибудь другой способ заменить 0?

Ответы [ 7 ]

4 голосов
/ 16 февраля 2010

print добавляет дополнительный символ новой строки после ввода, и у вас уже есть один символ новой строки.Вам следует либо удалить существующий символ новой строки (line.rstrip("\n")), либо использовать sys.stdout.write().

2 голосов
/ 16 февраля 2010
import fileinput
import re
p = re.compile(r'^0,')
for line in fileinput.FileInput("sample.txt",inplace=1):
    print p.sub('1,', line.strip())

Существующий код на самом деле не меняет строки так, как вы хотите; print a ничего не делает, если a на самом деле не определено! Таким образом, в итоге вы просто печатаете пустую строку (бит print a) и затем печатаете существующую строку, поэтому вы получаете файл, который не изменился, за исключением добавления некоторых пустых строк.

1 голос
/ 16 февраля 2010

Либо используйте rstrip для удаления завершающих строк перед печатью, либо используйте sys.stdout.write вместо print.

Кроме того, если вам нужно изменить только первый элемент, нет необходимости разбивать всю строку и присоединять ее снова. Вам нужно только разделить на первую запятую:

line.split(',', 1)

Если вам нужна еще лучшая производительность, вы также можете просто протестировать значение line[0] напрямую.

0 голосов
/ 16 февраля 2010

Самый простой способ сделать это - использовать анализатор 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)
0 голосов
/ 16 февраля 2010

Вы должны использовать запятую в конце вашего print , чтобы он не добавлял символ новой строки. Вот так:

print "Hello",

Вот что я придумал:

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))

Если вам нужна лучшая библиотека для обработки CSV, вы можете использовать это вместо split.

0 голосов
/ 16 февраля 2010
import fileinput
for line in fileinput.FileInput("sample.txt",inplace=1):
    s=line.rstrip().split(",")
    print a
    print ','.join(s)
0 голосов
/ 16 февраля 2010
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()

Это не проверено, но оно должно пройти большую часть пути. Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...