/ / błąd wartości z datetime.strptime - python

błąd wartości z datetime.strptime - python

Próbuję odczytać daty z pliku txt i przekonwertować je do formatu daty / godziny

Kod:

from datetime import datetime, date

with open("birth.txt") as f:
content = f.readlines()
content = [x.strip() for x in content]
for i in content:
a = i.split(":")
date_b = []
date_b.append(a[-1])
print date_b
for j in date_b:
date_object = datetime.strptime(str(j), "%m-%d-%Y")
print date_object

Plik tekstowy:

a:11-23-2001
b:02-14-2002

ValueError: dane czasu "11-23-2001" nie pasują do formatu "% m-% d-% Y"

Czy ktoś może mi pomóc rozwiązać ten błąd?

Odpowiedzi:

2 dla odpowiedzi № 1

Z Twoimi problemami wiąże się wiele problemówkod. Błąd jest spowodowany przez spację przed ciągiem daty, mimo że nie jestem pewien, skąd pochodzi dany plik.Również, dlaczego masz nawet drugą pętlę? I nadpisujesz date_b w każdej pętli linii ... Spróbuj tego:

from datetime import datetime

with open("birth.txt") as f:
dates = []  # store this outside of your loop
for line in f:  # read line by line
v, d = line.strip().split(":")
d = datetime.strptime(d.strip(), "%m-%d-%Y")  # just in case of additional whitespace
dates.append((v, d))
print(dates)
# [("a", datetime.datetime(2001, 11, 23, 0, 0)), ("b", datetime.datetime(2002, 2, 14, 0, 0))]

Możesz również zmienić ten słownik w słownik (dict(dates)) lub od razu zbuduj słownik.


0 dla odpowiedzi nr 2

Poza kwestiami, które wskazuje @zwer, tymieć poważną nieefektywność odczytu całego pliku do pamięci przed jego przetworzeniem. To faktycznie sprawia, że ​​twoja praca jest trudniejsza, niż jest to konieczne, ponieważ pliki w Pythonie są iterowalne po liniach. Możesz zrobić coś takiego:

from datetime import datetime, date

with open("birth.txt") as f:
for line in f:
key, datestr = line.strip().split(":")
dateobj = datetime.strptime(datestr, "%m-%d-%Y")
print(dateobj)

Używając faktu, że plik jest iteratorem, możesz napisać listę w jednym wierszu, aby wygenerować pełną listę dat:

with open("birth.txt") as f:
dates = [datetime.strptime(line.strip().split(":")[1], "%m-%d-%Y") for line in f]

Jeśli klucz ma jakieś znaczenie, możesz utworzyć słownik ze zrozumieniem słownika, używając podobnej składni:

with open("birth.txt") as f:
dates = {key: datetime.strptime(datestr, "%m-%d-%Y") for key, datestr in (line.strip().split(":") for line in f)}