Вы можете использовать вызов для команды DOS, но вызов функции в dll windows - лучший способ сделать это.
public struct SystemTime
{
public ushort Year;
public ushort Month;
public ushort DayOfWeek;
public ushort Day;
public ushort Hour;
public ushort Minute;
public ushort Second;
public ushort Millisecond;
};
[DllImport("kernel32.dll", EntryPoint = "GetSystemTime", SetLastError = true)]
public extern static void Win32GetSystemTime(ref SystemTime sysTime);
[DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
public extern static bool Win32SetSystemTime(ref SystemTime sysTime);
private void button1_Click(object sender, EventArgs e)
{
// Set system date and time
SystemTime updatedTime = new SystemTime();
updatedTime.Year = (ushort)2009;
updatedTime.Month = (ushort)3;
updatedTime.Day = (ushort)16;
updatedTime.Hour = (ushort)10;
updatedTime.Minute = (ushort)0;
updatedTime.Second = (ushort)0;
// Call the unmanaged function that sets the new date and time instantly
Win32SetSystemTime(ref updatedTime);
}
Предполагая, что ваш файл находится в формате одного псевдонима для каждой строки, используйте это.
Сначала откройте файл:
f = open("yourfile.txt","r")
Далее, получите все свои строки из file:
lines = f.readlines()
Теперь вы можете закрыть файл:
f.close()
И снова открыть его в режиме записи:
f = open("yourfile.txt","w")
Затем напишите назад, за исключением строки, которую вы хотите удалить. Возможно, вы захотите изменить "\n"
на любую строку, заканчивающую ваш файл.
for line in lines:
if line!="nickname_to_delete"+"\n":
f.write(line)
В конце закройте файл еще раз.
f.close()
Лучший и быстрый вариант, а не сохранение всего в списке и повторное открытие файла для его записи, на мой взгляд, для повторной записи файла в другом месте.
with open("yourfile.txt","r") as input:
with open("newfile.txt","wb") as output:
for line in input:
if line!="nickname_to_delete"+"\n":
output.write(line)
Вот и все. ! В одном цикле и один вы можете сделать то же самое. Это будет намного быстрее.
os.replace
(новый в python v 3.3) является более кросс-платформенным, чем системный вызов mv
.
– 7yl4r
15 November 2017 в 16:30
Мне понравился метод fileinput, описанный в этом ответе: Удаление строки из текстового файла (python)
Скажем, например, у меня есть файл с пустыми строками в он и я хочу удалить пустые строки, вот как я его решил:
import fileinput
import sys
for line_number, line in enumerate(fileinput.input('file1.txt', inplace=1)):
if len(line) > 1:
sys.stdout.write(line)
Примечание: пустые строки в моем случае имели длину 1
blockquote>
Сохраните строки файла в списке, затем удалите список, который вы хотите удалить, и напишите оставшиеся строки в новый файл
with open("file_name.txt", "r") as f:
lines = f.readlines()
lines.remove("Line you want to delete\n")
with open("new_file.txt", "w") as new_f:
for line in lines:
new_f.write(line)
В общем, вы не можете; вам нужно снова написать весь файл (по крайней мере, с точки зрения изменения до конца).
В некоторых конкретных случаях вы можете сделать лучше, чем это -
, если все ваши данные элементы имеют одинаковую длину и в определенном порядке, и вы знаете смещение того, с которым хотите избавиться, вы можете скопировать последний элемент над тем, который нужно удалить, и обрезать файл до последнего элемента;
, или вы можете просто перезаписать блок данных значением «это плохие данные, пропустить его» или оставить флаг «этот элемент удален» в ваших сохраненных элементах данных, чтобы вы могли пометить его удалением без изменения файл.
Вероятно, это избыток для коротких документов (что-то под 100 КБ?).
Это «вилка» из ответа @ Lother (который, я считаю, следует считать правильным ответом).
Для такого файла:
$ cat file.txt
1: october rust
2: november rain
3: december snow
вилка из решения Лоутера отлично работает:
#!/usr/bin/python3.4
with open("file.txt","r+") as f:
new_f = f.readlines()
f.seek(0)
for line in new_f:
if "snow" not in line:
f.write(line)
f.truncate()
Усовершенствования:
with open
, которые отбрасывают использование f.close()
if/else
для оценки того, нет ли строки в текущей строке Не очень хорошо, если вы положили весь файл в память, я знаю, что в настоящее время у каждого есть тонны памяти, но подумайте, есть ли в файле несколько ГБ журналов или что-то в этом роде.
Лучше всего скопировать его строку по строке в новый файл, чем удалить первый или что-то подобное
Наверное, у вас уже есть правильный ответ, но вот мой. Вместо использования списка для сбора нефильтрованных данных (что делает метод readlines()
), я использую два файла. Один из них предназначен для хранения основных данных, а второй для фильтрации данных при удалении определенной строки. Вот код:
main_file = open('data_base.txt').read() # your main dataBase file
filter_file = open('filter_base.txt', 'w')
filter_file.write(main_file)
filter_file.close()
main_file = open('data_base.txt', 'w')
for line in open('filter_base'):
if 'your data to delete' not in line: # remove a specific string
main_file.write(line) # put all strings back to your db except deleted
else: pass
main_file.close()
Надеюсь, вы найдете это полезным! :)
Проблема с чтением строк в первом проходе и внесением изменений (удаление определенных строк) во втором проходе заключается в том, что если размеры файлов огромны, у вас закончится ОЗУ. Вместо этого лучший подход состоит в том, чтобы читать строки один за другим и записывать их в отдельный файл, исключая те, которые вам не нужны. Я использовал этот подход с файлами размером до 12-50 ГБ, а использование ОЗУ остается практически неизменным. Только циклы процессоров показывают, что обработка продолжается.
Я думаю, если вы прочитаете файл в списке, то сделайте, вы можете перебирать список, чтобы искать прозвище, от которого вы хотите избавиться. Вы можете сделать это очень эффективно, не создавая дополнительных файлов, но вам придется записать результат обратно в исходный файл.
Вот как я могу это сделать:
import, os, csv # and other imports you need
nicknames_to_delete = ['Nick', 'Stephen', 'Mark']
Я предполагаю, что nicknames.csv
содержит такие данные, как:
Nick
Maria
James
Chris
Mario
Stephen
Isabella
Ahmed
Julia
Mark
...
Затем загрузите файл в список:
nicknames = None
with open("nicknames.csv") as sourceFile:
nicknames = sourceFile.read().splitlines()
Затем перейдите к списку, чтобы он соответствовал вашим входам delete:
for nick in nicknames_to_delete:
try:
if nick in nicknames:
nicknames.pop(nicknames.index(nick))
else:
print(nick + " is not found in the file")
except ValueError:
pass
Наконец, верните результат в файл:
with open("nicknames.csv", "a") as nicknamesFile:
nicknamesFile.seek(0)
nicknamesFile.truncate()
nicknamesWriter = csv.writer(nicknamesFile)
for name in nicknames:
nicknamesWriter.writeRow([str(name)])
nicknamesFile.close()
Решение этой проблемы только с одним открытым:
f = open("target.txt","r+")
d = f.readlines()
f.seek(0)
for i in d:
if i != "line you want to remove...":
f.write(i)
f.truncate()
f.close()
Это решение открывает файл в режиме r / w («r +») и использует поиск для сброса f-указателя, тогда truncate, чтобы удалить все после последней записи.
with open(...)
, а затем он мог бы сбросить f.close()
– Grezzo
2 June 2017 в 13:42
Возьмите содержимое файла, разделите его на новую строку на кортеж. Затем получите доступ к номеру строки вашего кортежа, присоедините полученный кортеж и перезапишите файл.
tuple(f.read().split('\n'))
?? (2) "доступ к номеру строки вашего кортежа" и "присоединиться к вашему исходному кортежу". звук довольно таинственный; фактический код Python может быть более понятным.
– John Machin
17 January 2011 в 05:49
Если вы используете Linux, вы можете попробовать следующий подход. Предположим, у вас есть текстовый файл с именем animal.txt
:
$ cat animal.txt
dog
pig
cat
monkey
elephant
Удалить первую строку:
>>> import subprocess
>>> subprocess.call(['sed','-i','/.*dog.*/d','animal.txt'])
, затем
$ cat animal.txt
pig
cat
monkey
elephant