如何使用Python解析.txt文件的特定部分?

时间:2019-02-26 14:33:58

标签: python parsing text

我有一个.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;

所有内容都用分号分隔在一起。该示例由两个对象组成,分别为idtime_starttime_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那里得到了一个很好的答案,该方法有效,但是我只是注意到,已解析的对象切掉了id的一部分。为了这个问题,我简化了id。完整ID(以及其余数据)如下所示:

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

如何获取完整ID?

4 个答案:

答案 0 :(得分:1)

实际上,它是带有;分隔符的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]))

答案 1 :(得分:0)

您需要使用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'

答案 2 :(得分:0)

您可以使用item.split(';')拆分一行以将其转换为列表。

您还可以使用csvreader或pandas将其作为csv解析为数组,但这是另一种方法。

如果订单正确,则可以使用tmpemployee = Employee(*item.split(';'))

将其直接包装到员工对象中

答案 3 :(得分:0)

您可以使用csv.reader作为分隔符的;方法,但是由于在输入的每一行上都有多余的结尾;,因此只能对每行的前3个项进行切片:

import csv
with open("test.txt", "r") as f:
    myArrayWithObjects = [Employee(*row[:3]) for row in csv.reader(delimiter=';')]