最近我对数据类型有疑问 从那时起,我一直在尝试使用NamedTuples(或多或少成功)。
我目前的问题:
- 如何将文件中的行导入新元组,
- 如何将用空格/制表符(/ what)分隔的值导入元组的给定部分?
喜欢:
Monday 8:00 10:00 ETR_28135 lh1n1522 Computer science 1
Tuesday 12:00 14:00 ETR_28134 lh1n1544 Geography EA 1
第一行应该进入元组[0]。第一个数据:元组[0] .day;第二名:元组[0] .start; ..等等。
当新行开始时(即两个TAB(\ t)),启动一个新的元组,如元组[1]。
我用它来分隔数据:
with open(Filename) as f: for line in f: rawData = line.strip().split('\t')
其余的逻辑仍然缺失(元组的填充)。
(我知道。这个问题,最近的问题实际上是低级别的。但是,希望这些也能帮助别人。如果你觉得这不是一个真正的问题,太简单了,不能成为问题等等,只是投票结束。谢谢你的理解。)
答案 0 :(得分:12)
这些数据库文件称为逗号分隔值,即使它们实际上没有用逗号分隔。 Python有一个方便的库csv
,可以让你轻松阅读这些文件
这是一个稍加修改的example from the docs
csv.register_dialect('mycsv', delimiter='\t', quoting=csv.QUOTE_NONE)
with open(filename, 'rb') as f:
reader = csv.reader(f, 'mycsv')
通常你一次只能工作一行。如果你需要一个元组中的整个文件,那么:
t = tuple(reader)
如果您需要按名称访问字段,可以使用cvs.DictReader,但我不知道具体如何,我无法在此处测试。
看看namedtuples是什么,我有点过时了。关于namedtuple如何使用csv模块有一个很好的例子:
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
import csv
for line in csv.reader(open("employees.csv", "rb")):
emp = EmployeeRecord._make(line)
print emp.name, emp.title
答案 1 :(得分:3)
这是一种做这种事情的紧凑方式。 首先声明订单项的类:
fields = "dow", "open_time", "close _time", "code", "foo", "subject", "bar"
Item = namedtuple('Item', " ".join(fields))
下一部分在你的循环中。
# this is what your raw data looks like after the split:
#raw_data = ['Monday', '8:00', '10:00', 'ETR_28135', 'lh1n1522', 'Computer science', '1']
data_tuple = Item(**dict(zip(fields, raw_data)))
现在慢慢地:
zip(fields, raw_data)
创建了一对对象列表,例如[("dow", "Monday"), ("open_time", "8:00"),..]
dict()
将其变为字典,例如{"dow": "Monday", "open_time": "8:00", ..}
**
将此词典解释为Item
构造函数的一堆关键字参数,相当于Item(dow="Monday", open_time="8:00",..)
。所以你的项目被命名为元组,所有值都是字符串。
修改强>
如果字段顺序不会改变,您可以更容易地做到:
data_tuple = Item(*raw_data)
这使用了文件中字段的顺序和Item
定义中参数顺序匹配的事实。
答案 2 :(得分:3)
如果要使用NamedTuple,可以使用Python文档中给出的稍微修改过的示例版本:
MyRecord = namedtuple('MyRecord', 'Weekday, start, end, code1, code2, title, whatever')
import csv
for rec in map(MyRecord._make, csv.reader(open("mycsv.csv", "rb"), delimiter='\t')):
print rec.weekday
print rec.title
# etc...