从文本文件中的每一行中删除第一个字符

izd*_*zdi 4 python python-2.7

我是Python新手,一般是编程.

我想从文本文件中的每一行中删除第一个字符,并将更改写回文件.例如,我有36行的文件,每行中的第一个字符包含一个符号或数字,我希望它被删除.

我在这里制作了一些代码,但它没有按预期工作,它只重复整个留置权.任何帮助将提前感谢!

from sys import argv

run, filename = argv

f = open(filename, 'a+')
f.seek(0)
lines = f.readlines()
for line in lines:
    f.write(line[1:])
f.close()
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 6

您的代码已经删除第一个字符.我救了你的确切代码既dupy.pydupy.txt,然后就跑python dupy.py dupy.txt了,结果是:

from sys import argv

run, filename = argv

f = open(filename, 'a+')
f.seek(0)
lines = f.readlines()
for line in lines:
    f.write(line[1:])
f.close()
rom sys import argv
un, filename = argv
 = open(filename, 'a+')
.seek(0)
ines = f.readlines()
or line in lines:
   f.write(line[1:])
.close()
Run Code Online (Sandbox Code Playgroud)

它不是复制整行; 它是在第一个字符被剥离的情况下复制行.


但是从你的问题的最初陈述,听起来你想要覆盖线条,而不是附加新的副本.为此,请勿使用append模式.读取文件,然后写下:

from sys import argv

run, filename = argv

f = open(filename)
lines = f.readlines()
f.close()
f = open(filename, 'w')
for line in lines:
    f.write(line[1:])
f.close()
Run Code Online (Sandbox Code Playgroud)

或者,或者,写一个新文件,然后在完成后将其移到原始文件之上:

import os
from sys import argv

run, filename = argv

fin = open(filename)
fout = open(filename + '.tmp', 'w')
lines = f.readlines()
for line in lines:
    fout.write(line[1:])
fout.close()
fin.close()
os.rename(filename + '.tmp', filename)
Run Code Online (Sandbox Code Playgroud)

(请注意,此版本在Windows上不能正常工作,但它比实际的跨平台版本更简单;如果您需要Windows,我可以解释如何执行此操作.)


通过使用with语句,直接在文件上循环而不是调用readlines,可以使代码更简单,更健壮,更高效,并使用tempfile:

import tempfile
from sys import argv

run, filename = argv

with open(filename) as fin, tempfile.NamedTemporaryFile(delete=False) as fout:
    for line in fin:
        fout.write(line[1:])
    os.rename(fout.name, filename)
Run Code Online (Sandbox Code Playgroud)

在大多数平台上,这可以保证"原子写入" - 当您的脚本完成时,或者即使有人在其运行过程中拔出插件,该文件最终将被新版本替换,或者不受影响; 它不可能最终被中途覆盖到不可恢复的垃圾中.

此版本再次无法在Windows上运行.如果没有大量的工作,就无法在Windows上实现这种"写 - 临时和重命名"算法.但是你可以通过一些额外的工作来接近:

with open(filename) as fin, tempfile.NamedTemporaryFile(delete=False) as fout:
    for line in fin:
        fout.write(line[1:])
    outname = fout.name
os.remove(filename)
os.rename(outname, filename)
Run Code Online (Sandbox Code Playgroud)

这确实可以防止您半覆盖文件,但是它会留下一个漏洞,您可能已经删除了原始文件,并将新文件保留在您必须搜索的临时位置.您可以通过将文件放在更容易找到的位置来使这更好一些(请参阅NamedTemporaryFile文档以了解如何).或者将原始文件重命名为临时名称,然后写入原始文件名,然后删除原始文件.或其他各种可能性.但实际上获得与其他平台相同的行为是非常困难的.