Проблема с циклом Python for, используемым для построчного изменения текстового файла с условием - PullRequest
0 голосов
/ 23 января 2019

У меня есть файл с заданиями для вопросов и ответов с именем DateLoopTest.txt

190121 [3] tidy up my office
190122 take my clothes to the laundry
190123 go to the library #(today)
190124 [7] wash my car

, и я хочу получить:

190124 [3] tidy up my office
190122 take my clothes to the laundry
190123 go to the library
190124 [7] wash my car

с приращением даты с цифрами, заключенными в скобкиКонечно, только если дата раньше, чем сегодня.

Это код, который я придумал (я использую Pythonista на iOs):

#coding: utf-8

import time
import datetime
from datetime import datetime
import re

with open('DateLoopTest.txt') as f:

    for line in f:

        digits = re.findall(r'\d+', f)

        startdateshort = digits[0]
        interval = int(digits[1])

        startdateepoch = int(datetime.strptime(startdateshort, '%y%m%d').strftime("%s"))+43200

        enddateepoch = startdateepoch+interval*86400

        enddateshort = time.strftime('%y%m%d', time.localtime(enddateepoch))

        now = time.time()

        if now > startdateepoch:
            newline = re.sub('\d{6}', str(enddateshort), line)
            print(newline)

и ... ничего не происходит (кромесообщение (относительно определения «цифр»: «ожидаемая строка или байтовоподобный объект».

Что пошло не так?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вам нужно это:

#coding: utf-8

import time
import datetime
from datetime import datetime
import re
from tempfile import mkstemp
from shutil import move
from os import fdopen, remove


fh, tmpfilepath = mkstemp()
path = '/Users/earncef/Downloads/Dateloops.txt'
with fdopen(fh, 'w') as tmpfile:
    with open(path) as f:
        for line in f:
            digits = re.findall(r'\d+', line)

            startdateshort = digits[0]
            interval = 0
            if len(digits) > 1:
                interval = int(digits[1])

            startdateepoch = int(datetime.strptime(startdateshort, '%y%m%d').strftime("%s"))+43200

            enddateepoch = startdateepoch+interval*86400

            enddateshort = time.strftime('%y%m%d', time.localtime(enddateepoch))

            now = time.time()

            if now > startdateepoch:
                newline = re.sub('\d{6}', str(enddateshort), line)
                tmpfile.write(newline)
                print(newline)

        remove(path)
        move(tmpfilepath, path)
0 голосов
/ 23 января 2019

Это один подход.

import re
import datetime

s = """190121 [3] tidy up my office
190122 take my clothes to the laundry
190123 go to the library #(today)
190124 [7] wash my car"""

now = datetime.datetime.now()

for line in s.splitlines():        #Iterating Each line 
    line = line.strip()
    m = re.search(r"\[(\d+)\]", line)    #Check if increment date in line
    if m:
        old_date = line.split()[0]       #Get Old date
        dateVal = datetime.datetime.strptime(old_date, '%y%m%d')   #Convert string to datetime object. 
        if now > dateVal:                #Check Date
            print(line.replace(old_date, (dateVal + datetime.timedelta(days=int(m.group(1)))).strftime('%y%m%d')))    #Update
        else:
            print(line)
    else:
        print(line)

Вывод:

190124 [3] tidy up my office
190122 take my clothes to the laundry
190123 go to the library #(today)
190124 [7] wash my car
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...