2010-02-12 4 views
2

Я новичок в программировании на Python ...Заменить слово в файле

У меня есть .txt файл ....... Это похоже ..

0, зарплата, 14000

0, Bonus, 5000

0, дарение, 6000

Я хочу, чтобы заменить первый '0' значение '1' в каждой строке. Как я могу это сделать? Любой может мне помочь .... С образцом кода ..

Заранее спасибо. Nimmyliji

ответ

2
o=open("output.txt","w") 
for line in open("file"): 
    s=line.split(",") 
    s[0]="1" 
    o.write(','.join(s)) 
o.close() 

Или вы можете использовать FileInput с в месте редактирования

import fileinput 
for line in fileinput.FileInput("file",inplace=1): 
    s=line.split(",") 
    s[0]="1" 
    print ','.join(s) 
+0

'a' сохранит то, что уже было в файле. –

2
f = open(filepath,'r') 
data = f.readlines() 
f.close() 

edited = [] 
for line in data: 
    edited.append('1'+line[1:]) 

f = open(filepath,'w') 
f.writelines(edited) 
f.flush() 
f.close() 

Или в Python 2.5+:

with open(filepath,'r') as f: 
    data = f.readlines() 

with open(outfilepath, 'w') as f: 
    for line in data: 
     f.write('1' + line[1:]) 

Это должно сделать это. Я бы не рекомендовал его для действительно большой файл, хотя ;-) Что происходит (бывший 1):

1: Открыть файл в режиме чтения

2,3: Читать все строки в список (каждая строка - отдельный индекс) и закрыть файл.

4,5,6: Итерируйте по списку, создавая новый список, где каждая строка имеет первый символ, замененный на 1. Линия [1:] срезает строку из индекса 1 вперед. Мы объединяем 1 с усеченным списком.

7,8,9: Повторно открыть файл в режиме записи, записать список в файл (перезаписать), сбросить буфер и закрыть дескриптор файла.

В исх. 2:

Я использую оператор with, который позволяет дескриптору файла закрывать себя, но делает по существу то же самое.

+1

'rw' является недопустимым, и даже если это не так, запись начинается в конце файла. –

+0

О, хватит, я исправлю это (я мог бы поклясться, что append был «+»). – SapphireSun

+0

Похоже, что режим «rw» не является полностью недействительным. Вы можете прочитать файл, но если вы попытаетесь написать, вы получите IOError (даже если вы попытаетесь написать, прежде чем читать). – SapphireSun

4

Я знаю, что вы спрашиваете о Python, но простите меня за предположение, что, возможно, другой инструмент лучше для работы. :) Это один лайнер через sed:

sed 's/^0,/1,/' yourtextfile.txt > output.txt 

Это относится регулярное выражение /^0,/ (который соответствует любому 0,, что происходит в начале строки) для каждой строки и заменяет совпавший текст с 1, вместо этого. Выход направляется в указанный файл output.txt.

+0

то, что он хочет сделать, может быть частью более крупной задачи. «Лучше для работы», может быть, нет. – ghostdog74

+0

Регулярное выражение может быть реализовано с использованием модуля регулярных выражений Python. Поэтому, хотя 'sed' может и не быть хорошим ответом, концепция регулярного выражения, IMHO. –

3
inFile = open("old.txt", "r") 
outFile = open("new.txt", "w") 
for line in inFile: 
    outFile.write(",".join(["1"] + (line.split(","))[1:])) 

inFile.close() 
outFile.close() 

Если вы хотите что-то более общее, посмотрите на Python csv модуль. Он содержит утилиты для обработки comma-separated values (сокращенно csv) в файлах. Но он может работать с произвольным разделителем, а не только с запятой.Так как вы образец, очевидно, CSV файл, вы можете использовать его следующим образом:

import csv 
reader = csv.reader(open("old.txt")) 
writer = csv.writer(open("new.txt", "w")) 
writer.writerows(["1"] + line[1:] for line in reader) 

Для перезаписи исходного файла с новым:

import os 
os.remove("old.txt") 
os.rename("new.txt", "old.txt") 

Я думаю, что запись в новый файл, а затем переименовать его является более отказоустойчивым и менее вероятным образом повреждает ваши данные, чем прямая перезапись исходного файла. Представьте себе, что ваша программа вызвала исключение, а исходный файл уже был прочитан в память и снова открыт для записи. Таким образом, вы потеряете исходные данные, и ваши новые данные не будут сохранены из-за сбоя программы. В моем случае я теряю только новые данные, сохраняя оригинал.

+0

+1 для упоминания модуля csv. Это действительно спасло мой бекон * так * много раз! –

Смежные вопросы