Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python问题与';b';使用从numpy加载文本导入cdv时_Python_Csv_Numpy - Fatal编程技术网

Python问题与';b';使用从numpy加载文本导入cdv时

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

对不起,我是新的,所以如果这已经包括分享链接,因为我找不到它

我有一个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:
    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,因为它比正常打开文件效率低。非常感谢您对其中一个选项的解释,为什么会出现这种情况!