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 № 1Z 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)}