Python问题与';b';使用从numpy加载文本导入cdv时
对不起,我是新的,所以如果这已经包括分享链接,因为我找不到它 我有一个csv,在文本查看器中显示如下Python问题与';b';使用从numpy加载文本导入cdv时,python,csv,numpy,Python,Csv,Numpy,对不起,我是新的,所以如果这已经包括分享链接,因为我找不到它 我有一个csv,在文本查看器中显示如下 TeamCode,Name,ConferenceCode 5,Akron,875 8,Alabama,911 9,UAB,24312 我试着用下面的方法把它导入字典 import numpy as np key_value = np.loadtxt('team.csv', delimiter=",",skiprows = 1, dtype = 'str') for i in key_value
TeamCode,Name,ConferenceCode
5,Akron,875
8,Alabama,911
9,UAB,24312
我试着用下面的方法把它导入字典
import numpy as np
key_value = np.loadtxt('team.csv', delimiter=",",skiprows = 1, dtype = 'str')
for i in key_value:
print(i)
mydict = { k:[v, z] for k,v,z in key_value}
返回
["b'5'" "b'Akron'" "b'875'"]
["b'8'" "b'Alabama'" "b'911'"]
["b'9'" "b'UAB'" "b'24312'"]
我不知道为什么我得了b。如果有更好的方法,请让我知道,但我正在尝试从csv创建字典,并认为这应该是可行的。由于我得到了b的东西没有按计划使用字典
新编辑。。。
我感谢所有的帮助,但是有人知道我为什么得到b吗?当导入numpy模块时,它会出现,我明白了,其他一切都正常。我在mac电脑上运行,没有任何原因会导致它正常运行?您可以解码,然后您可以访问密钥,而无需使用
b“5”
等:
mydict = { k.decode("utf-8"):[v.decode("utf-8"), z.decode("utf-8")] for k,v,z in key_value}
In [46]: mydict
Out[46]: {'5': ['Akron', '875'], '8': ['Alabama', '911'], '9': ['UAB', '24312']}
In [47]: mydict["5"]
Out[47]: ['Akron', '875']
您可以正常打开它:
mydict = { }
with open('in.csv')as f:
next(f) # skip header
for line in f:
k,v,z = line.rstrip().split(",")
mydict[k] = [v,z]
print(mydict)
{'9': ['UAB', '24312'], '8': ['Alabama', '911'], '5': ['Akron', '875']}
或使用csv模块:
import csv
mydict = { }
with open('out.txt') as f:
next(f)
reader = csv.reader(f,delimiter=",")
for row in reader:
k,v,z = row
mydict[k] = [v,z]
print(mydict)
如果您希望数字为ints
使用:
mydict[int(k)]= [v,int(z)]
一些时间安排:
In [39]: %%timeit
....: key_value = np.loadtxt(
....: 'team.csv',
....: delimiter=",",
....: skiprows = 1,
....: dtype = bytes
....: ).astype(str)
....: mydict = { k:[v, z] for k,v,z in key_value}
....:
10000 loops, best of 3: 123 µs per loop
In [40]:
In [40]: %%timeit
....: mydict = { }
....: with open('team.csv') as f:
....: next(f)
....: reader = csv.reader(f,delimiter=",")
....: for line in reader:
....: k,v,z = line
....: mydict[k]= [v,z]
....:
10000 loops, best of 3: 42.9 µs per loop
In [42]: %%timeit
mydict = { }
with open('team.csv')as f:
next(f) # skip header
for line in f:
k,v,z = line.rstrip().split(",")
mydict[k] = [v,z]
....:
10000 loops, best of 3: 37.6 µs per loop
使用150行的文件,numpy的效率要低得多:
In [12]: %%timeit
....: key_value = np.loadtxt(
....: 'team.csv',
....: delimiter=",",
....: skiprows = 1,
....: dtype = bytes
....: ).astype(str)
....: mydict = { k:[v, z] for k,v,z in key_value}
....:
100 loops, best of 3: 2.01 ms per loop
In [13]: %%timeit
....: mydict = { }
....: with open('team.csv')as f:
....: next(f) # skip header
....: for line in f:
....: k,v,z = line.rstrip().split(",")
....: mydict[k] = [v,z]
....:
10000 loops, best of 3: 165 µs per loop
我相信这种任务不需要numpy,因为不管怎样,您都可以将数据转换为Python
dict
。您可以非常轻松地自己实现解析:
with open('team.csv') as f:
mydict = {k : [v, z] for k, v, z in (line.rstrip().split(',') for line in f)}
这是
np.loadtxt
中的一个错误,与Python3在字节字符串和文本字符串之间的区别有关:它将CSV作为字节字符串处理,而CSV应该被视为文本
当然,正如Padraic Cunningham正确指出的那样,此任务不需要numpy,可以使用csv
模块。如果您想继续使用numpy,在修复该错误之前,您有两个选择:
dtype=bytes
,这将正确地将值解释为字节字符串。然后,将它们转换为真正的字符串。如果所有字段都是字符串,则可以非常简洁地执行此操作,如下所示:
key_value = np.loadtxt(
'team.csv',
delimiter=",",
skiprows = 1,
dtype = bytes
).astype(str)
np.loadtxt
时手动指定右转换器:
key_value = np.loadtxt(
'team.csv',
delimiter=",",
skiprows = 1,
dtype = str,
converters = {k:np.compat.asstr for k in range(3)}
)
b
是如何影响你的代码的?它使得键中有b。谢谢你的回复,那么有没有办法在读取时解码呢?我原以为python 3会忽略这个字符……老实说,不确定,但是如果你在dict或dict中读取它时解码,这也没什么不同,你仍然需要在某个地方执行。谢谢你的其他脚本导入了该文件,但如果我使用csv模块,我仍然会遇到b的问题。因此,这将“解决”这个问题,但我希望理解为什么我会在csv模块和numpy模块中得到它。我使用的是ubuntu,我可以使用mydict[“5”]
访问。如果你真的想要字符串,只需使用解码
方法,我向你展示了你使用了多少数据?仅给出3行或更多行?OP有两个以上选项,其中一个选项是根本不使用numpy,因为它比正常打开文件效率低。非常感谢您对其中一个选项的解释,为什么会出现这种情况!