最近我遇到了一个关于数据类型的问题。
从那以后,我一直在尝试使用NamedTuples (或多或少地成功了)。
我现在的问题是:
比如:
Monday 8:00 10:00 ETR_28135 lh1n1522 Computer science 1
Tuesday 12:00 14:00 ETR_28134 lh1n1544 Geography EA 1 第一行应该是元组。第一个数据: tuple.day;第二个: tuple.start;..and等等。
当新行开始时(即两个TAB (\t),启动一个新的元组,如tuple1)。
我用它来分离数据:
在f: rawData = line.strip().split('\t')中将open(Filename)作为f: for行
其余的逻辑仍然缺失(元组的填充)。
(我知道。这个问题和最近的一个问题都是很低层次的问题。然而,希望这些也能帮助到别人。如果你觉得这不是一个真正的问题,太简单而不能成为一个问题等等,就投票结束吧。(谢谢你的理解。)
发布于 2011-04-29 09:37:58
这样的数据库文件被称为逗号分隔的值,即使它们实际上不是用逗号分隔的。Python有一个名为csv的方便的库,它允许您轻松地读取此类文件。
下面是一个稍微修改过的文档中的示例
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,但我不知道它到底是如何工作的,我无法在这里测试它。
编辑2
看看名元组是什么,我有点过时了。关于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发布于 2011-04-29 09:52:41
这里有一种简洁的方法来做这样的事情。首先声明行项的类:
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定义中的参数顺序相匹配的事实。
发布于 2011-04-29 09:54:19
如果您想使用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...https://stackoverflow.com/questions/5830197
复制相似问题