我有一个.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那里得到了一个很好的答案,该方法有效,但是我只是注意到,已解析的对象切掉了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?
答案 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=';')]