У меня есть файл журнала (текст) с этим синтаксисом
1/21/18, 22:48 - ~text~
1/21/18, 22:48 - ~text~
1/23/18, 22:48 - ~text~
~text~
~text~
1/24/18, 22:48 - ~text~
И я хотел бы получить массив всех дат, например ["1/21/18","1/21/18","1/23/18","1/24/18"]
Потому что моя конечная цель - построить гистограмму частот для каждой даты, чтобы знать количество событий, которые каждый день имел (просто знать эволюцию событий во времени) (поэтому, если вы хотите дать совет, чтобы сделать это проще, его приветствовать!)
Я попробовал регулярное выражение в соответствии с вопросом 4709652, но это не работает должным образом. В любом случае, одна из моих проблем заключается в том, что текстовый файл большой (сотни мегабайт), что приводит к замедлению.
Каков оптимальный способ сделать это?
Спасибо!
Как предложил @Patrick, панды были бы более простым и эффективным способом сделать это.
import pandas as pd
p = pd.read_csv(<name of the file>,names=["date","random"])
p['date'] = pd.to_datetime(p['date'],errors='coerce') #converts the first column to date type and puts a NaT in place of texts.
p = p.dropna() #drop rows containing NaT
print(p['date'])
Выход:
0 2018-01-21
1 2018-01-21
2 2018-01-23
5 2018-01-24
Вы даже можете передать столбец даты функции гистограммы, если она игнорирует NaT, не отбрасывая их.
Вы можете читать файл по строкам и применять регулярное выражение для каждой строки, например:
import re
list = list()
with open('logs.txt', 'r') as fp:
line = fp.readline()
while line:
dates = re.findall('(\d+\/\d+\/\d+)', line)
map(list.append, dates)
line = fp.readline()
print(list)
Выход:
['1/21/18', '1/21/18', '1/23/18', '1/24/18']
Предполагая, что весь текстовый файл имеет тот же формат, это должно работать.
def process():
file = open('test.txt')
dates = []
for line in file.readlines():
if line[0] != '~':
dates.append(line.strip(' - ~text~').split(',')[0])
return dates
print(process())
Это результат.
['1/21/18', '1/21/18', '1/23/18', '1/24/18']
Вы можете использовать re.findall
для этого
import re
text = '1/21/18, 22:48 - ~text~\n1/21/18, 22:48 - ~text~\n1/23/18, 22:48 - ~text~\n~text~\n~text~\n1/24/18, 22:48 - ~text~'
re.findall(r'^([\d/]+),', text, re.MULTILINE)
# ['1/21/18', '1/21/18', '1/23/18', '1/24/18']