Ваш код уже делает удалить первый символ. Я спас именно ваш код, как dupy.py
и dupy.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()
Это не копирование целых строк; это копирование строк с их первым символом.
Но от исходной постановки вашей проблемы, это звучит, как вы хотите, чтобы перезаписать строки, а не добавлять новые копии. Для этого не используйте режим 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()
Или, наоборот, записать новый файл, а затем переместить его поверх оригинала, когда вы сделали:
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)
(Обратите внимание, что эта версия не будет работать, как есть на Windows, но это проще, чем текущая версия кросс-платформенного;., если вам нужна Windows, я могу объяснить, как это сделать)
вы можете сделать код намного проще, более надежными и более эффективными Cient с помощью 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)
На большинстве платформ, это гарантирует «атомное запись» -когда ваш сценарий заканчивается, или даже если кто-то тянет подключится к середине запуска, файл будет либо заменен новой версией, либо нетронутым; нет никакого способа, которым это может закончиться на полпути, переписанным в неустранимый мусор.
Опять же эта версия не будет работать в Windows. Без большой работы нет способа реализовать этот алгоритм «write-temp-and-rename» в 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)
Это мешает вам половинную перезаписи файла, но он оставляет дыру там, где вы, возможно, удалены исходный файл, и оставили новый файл во временном месте, которое вам нужно будет искать. Вы можете сделать это немного лучше, поставив файл куда проще найти (см. Документы NamedTemporaryFile
, чтобы увидеть, как). Или переименуйте исходный файл во временное имя, а затем запишите исходное имя файла, а затем удалите исходный файл. Или различные другие возможности. Но на самом деле добиться такого же поведения, как на других платформах, очень сложно.
Ваша цель - написать программу или удалить символы. Если последнее, то выполните: 'sed -i 's /^.//' filename.txt'. –
Просто удалите символы. Кстати, это reg exp? Как использовать строку кода ur? – izdi
Чтобы использовать решение Роба, вам нужно установить программное обеспечение '' sed'' – eyquem