2016-04-14 3 views
0

Код:Как удалить определенную строку из файла с помощью python?

from datetime import datetime,time 
from csv import reader 

with open('onlyOnce.txt', 'r+') as fonlyOnce: 
    for f_time, sec_time, dte in filter(None, reader(fonlyOnce, delimiter="_")): 

     check_stime=f_time.split(":") 
     Stask_hour=check_stime[0] 
     Stask_minutes=check_stime[1] 
     check_stime = datetime.strptime(f_time,"%H:%m").time() 

     check_etime=sec_time.split(":") 
     Etask_hour=check_etime[0] 
     Etask_minutes=check_etime[1] 

     #check every minute if current information = desired information 
     now = datetime.now() 
     now_time = now.time() 
     date_now = now.date() 

     if (date_now.strftime("%Y-%m-%d") == dte and time(int(Stask_hour),int(Stask_minutes)) <= now_time <= time(int(Etask_hour),int(Etask_minutes))): 
      print("this line in range time: "+ f_time) 
      #delete this line 
      fonlyOnce.write(" ") 
     else: 
      print("Padraic Cunningham") 
fonlyOnce.close() 

Цель данного кода:

1- петлю на линии в файле

2- проверить, если какой-либо линии, что в диапазоне от текущего времени

3- если да: напечатайте this line in range time: 9:1 и удалите эту строку из того же файла.

4-данные в файле:

7:1_8:35_2016-04-14 
8:1_9:35_2016-04-14 
9:1_10:35_2016-04-14 

5- выход должен быть:

7:1_8:35_2016-04-14 
8:1_9:35_2016-04-14 

, так как последняя линия имеет время в диапазоне тока time.It должен удалить и заменить пустая строка.

Моя проблема в том, этот код будет очистить весь файл и я не хочу, чтобы:

код invaild: fonlyOnce.write(" ")

Благодаря

+0

У вас проблема с отступом, в начале fonlyOnce отсутствовало пространство. Редактировали. – tfv

+0

Я думаю, вы слишком усложняете это, пытаясь сделать это на месте. Вы пытались записать строки, которые хотите сохранить во временном файле, а затем заменить исходный файл временным файлом в конце? – SpoonMeiser

+0

Возможный дубликат [Самый быстрый способ удалить строку из большого файла в Python] (http://stackoverflow.com/questions/2329417/fastest-way-to-delete-a-line-from-large-file-in- python) – martijnn2008

ответ

1

что я сделал:
1. удалить функцию определения из цикла.
2. если не соответствовать вашим потребностям, замените данные с пустым списком
3. открыть новый файл для записи обработанных данных

def IsFit(f_time, sec_time, dte): 
     check_stime=f_time.split(":") 
     Stask_hour=check_stime[0] 
     Stask_minutes=check_stime[1] 
     check_stime = datetime.strptime(f_time,"%H:%m").time() 

     check_etime=sec_time.split(":") 
     Etask_hour=check_etime[0] 
     Etask_minutes=check_etime[1] 

     #check every minute if current information = desired information 
     now = datetime.now() 
     now_time = now.time() 
     date_now = now.date() 

     if (date_now.strftime("%Y-%m-%d") == dte and time(int(Stask_hour),int(Stask_minutes)) <= now_time <= time(int(Etask_hour),int(Etask_minutes))): 
      return False 
     else: 
      return True 

    with open('onlyOnce.txt', 'r+') as fonlyOnce: 
     res = [ line if IsFit(*line) else [] for line in csv.reader(fonlyOnce, delimiter="_") if line ] 

    with open(NewFile,'wb') as f: 
     wirter = csv.wither(f) 
     wirter.writerows(res) 
+0

Хорошо, но если я хочу всегда читать из файла onlyOnce.txt, данные обновления сохраняются в NewFile !! – Samah

+0

@Samah да он сохраняется в новом файле – galaxyan

+0

, тогда !! если я хочу переписать !!! Я хочу переписать в том же файле, потому что я хочу читать только – Samah

0

решение перебором - подходит для файлов малого размера

0- создать буфер линий

1- петля на линиях в файле

1.1- проверить, если какой-либо линии, что в пределах текущего времени

1.2- если да: печатать эту строку в диапазоне времени: 9: 1 если нет: добавить строку в буфер

2 - закрыть файл для чтения

3- добавить пустую строку в буфер

4- открыть файл для записи

5- вровень буфер в файл и сохраните п ile

0
  • Вы не хотите редактировать файл, который вы читаете. Это плохая идея!

  • Вместо этого, вы можете рассмотреть вопрос о чтении каждой строки файла в список, удаление нежелательных элементов из списка, а затем писать над файл с этим списком.

    Если ваш файл большой, это может быть медленным.

    Кроме того, в конце вашего кода вы вызываете fonlyOnce.close(), но вам не нужно. Менеджер контекста (оператор with) автоматически закрывает файл после его останова.

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