Как мне разобрать определенные части файла .txt с Python? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть .txt с данными, которые мне нужно проанализировать с object, которые затем следует поместить в list.Файл .txt огромен, но вот пример:

5764;3/13/2015 8:00:00 AM;3/13/2015 1:00:00 PM;
C5CA;1/3/2015 12:30:00 PM;1/3/2015 1:00:00 PM;

Все это одним куском, разделенным точкой с запятой.Образец состоит из двух объектов с id, time_start и time_end

Я создал class, который выглядит следующим образом:

class Employee:

def __init__(self, id, time_start, time_end):
    self.id = id
    self.time_start = time_start
    self.time_end = time_end

Основная часть выглядит следующим образомс открытием файла и попыткой его проанализировать:

my_array_with_objects = []

my_file = open("test.txt", "r")

for item in my_file:
    temp_employee = Employee()
    temp_employee.id = item_first_semicolon_part
    temp_employee.time_start = item_second_semicolon_part
    temp_employee.time_end = item_third_semicolon_part

    my_array_with_objects.append(temp_employee)

myFile.close()

Итак, проблема в том, что я не знаю, как получить доступ к определенным частям файла .txt, разделенным точкой с запятой.Очевидно, "item_first_semicolon_part" не будет работать.Но как мне получить доступ к первой части текстового файла, чтобы получить номер id и ничего больше (а затем время начала и окончания)?Есть ли элегантный способ сделать это или просто вопрос использования if ; do this.

Заранее спасибо.Я просматривал похожие вопросы, но не думаю, что было что-то, что могло бы помочь мне в этом.

ОБНОВЛЕНИЕ Я получил отличный ответ от @Alderven, чтосработало, но я просто заметил, что разобранный объект обрезает часть идентификатора.Я упростил идентификатор ради этого вопроса.Полный идентификатор (с остальными данными) выглядит следующим образом:

57646786307395936680161735716561753784;3/13/2015 8:00:00 AM;3/13/2015 1:00:00 PM;C5CAACCED1B9F361761853A7F995A1D4F16C8BCD0A5001A2DF3EC0D7CD539A09AA7DDA1A5278FA07554B0260880882CCBB30B3399C3C0974C587A8233E5788A81DEAD2921123CB12D13CC11318C38B9679D868145315F1BE24333202D12B3787E51D1BBF97BB25482B0EF7E97DE637BAACEDD74E89E2AC52139EE9369F1D64A6 259939411636051033617118653993975778241;1/3/2015 12:30:00 PM;1/3/2015 1:00:00 PM;

Часть: C5CAACCED1B9F361761853A7F995A1D4F16C8BCD0A5001A2DF3EC0D7CD539A09AA7DDA1A5278FA07554B0260880882CCBB30B3399C3C0974C587A8233E5788A81DEAD2921123CB12D13CC11318C38B9679D868145315F1BE24333202D12B3787E51D1BBF97BB25482B0EF7E97DE637BAACEDD74E89E2AC52139EE9369F1D64A6

, кажется, отсутствует.Возможно, потому что он находится в одном ряду с первым объектом.Последняя часть id все еще там:

259939411636051033617118653993975778241

Как мне получить полный идентификатор?

Ответы [ 4 ]

0 голосов
/ 26 февраля 2019

Вы можете использовать метод csv.reader с ; в качестве разделителя, но нарезать только первые 3 элемента в каждой строке, так как у вас есть избыточный трейлинг ; в каждой строке ввода:

import csv
with open("test.txt", "r") as f:
    myArrayWithObjects = [Employee(*row[:3]) for row in csv.reader(delimiter=';')]
0 голосов
/ 26 февраля 2019

вы можете разбить строку, используя item.split(';'), чтобы превратить ее в список.

вы также можете проанализировать ее как csv в массив, используя csvreader или pandas, но это отдельный подход.

если заказ правильный, вы можете распаковать его непосредственно в объект сотрудника, используя tmpemployee = Employee(*item.split(';'))

0 голосов
/ 26 февраля 2019

На самом деле это формат CSV с ; разделителем.В основном:

import csv

with open('test.txt', newline='\n') as f:
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        print(row)

Если вы хотите проанализировать данные в вашем классе Employee, то:

import csv

class Employee:
    def __init__(self, id, timeStart, timeEnd):
        self.id = id
        self.timeStart = timeStart
        self.timeEnd = timeEnd

myArrayWithObjects = []
with open('test.txt', newline='\n') as f:
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        myArrayWithObjects.append(Employee(row[0], row[1], row[2]))
0 голосов
/ 26 февраля 2019

Вам нужно разделить строку на ;, используя str.split:

>>> line = "5764;3/13/2015 8:00:00 AM;3/13/2015 1:00:00 PM;"
>>> parts = line.split(";")
>>> parts
['5764', '3/13/2015 8:00:00 AM', '3/13/2015 1:00:00 PM', '']
>>> ID = parts[0]
>>> start = parts[1]
>>> end = parts[2]
>>> ID
'5764'
>>> start
'3/13/2015 8:00:00 AM'
>>> end
'3/13/2015 1:00:00 PM'

Вы можете сократить это, удалив последний ; из строки и присвоив несколькозначения сразу:

>>> line = "5764;3/13/2015 8:00:00 AM;3/13/2015 1:00:00 PM;"
>>> line = line.strip(";")
>>> ID, start, end = line.split(";")
>>> ID
'5764'
>>> start
'3/13/2015 8:00:00 AM'
>>> end
'3/13/2015 1:00:00 PM'
...