【发布时间】:2010-02-12 08:02:18
【问题描述】:
我是 Python 编程新手...
我有一个 .txt 文件.......看起来像..
0,工资,14000
0,奖金,5000
0,礼物,6000
我想将每行中的第一个“0”值替换为“1”。我怎样才能做到这一点?任何人都可以帮助我....带有示例代码..
提前致谢。 尼米利吉
【问题讨论】:
我是 Python 编程新手...
我有一个 .txt 文件.......看起来像..
0,工资,14000
0,奖金,5000
0,礼物,6000
我想将每行中的第一个“0”值替换为“1”。我怎样才能做到这一点?任何人都可以帮助我....带有示例代码..
提前致谢。 尼米利吉
【问题讨论】:
我知道您问的是 Python,但请原谅我建议使用不同的工具可能更适合这项工作。 :) 这是通过sed 的单线:
sed 's/^0,/1,/' yourtextfile.txt > output.txt
这会将正则表达式/^0,/(匹配出现在行首的任何0,)应用于每一行,并将匹配的文本替换为1,。输出被定向到指定的文件 output.txt 中。
【讨论】:
sed 可能不是一个好的答案,但正则表达式的概念是,恕我直言。
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)的实用程序。但它可以与任意分隔符一起使用,而不仅仅是逗号。因此,当您的 sample 显然是一个 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")
我认为写入新文件然后重命名它比直接覆盖源文件更具容错性并且不太可能损坏您的数据。想象一下,当源文件已经读入内存并重新打开以进行写入时,您的程序引发了异常。因此,您会丢失原始数据,并且由于程序崩溃而无法保存新数据。就我而言,我只会在保留原始数据的同时丢失新数据。
【讨论】:
o=open("output.txt","w")
for line in open("file"):
s=line.split(",")
s[0]="1"
o.write(','.join(s))
o.close()
或者你可以使用文件输入和就地编辑
import fileinput
for line in fileinput.FileInput("file",inplace=1):
s=line.split(",")
s[0]="1"
print ','.join(s)
【讨论】:
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。 line[1:] 从索引 1 开始对字符串进行切片。我们将 1 与截断的列表连接起来。
7,8,9:以写入模式重新打开文件,将列表写入文件(覆盖),刷新缓冲区,关闭文件句柄。
在例如。 2:
我使用 with 语句让文件自己处理关闭,但本质上做的是相同的事情。
【讨论】:
rw 无效,即使不是,也会从文件末尾开始写入。
flush() 在你关闭文件时是多余的。