从numpy导入cdv时Python出现“b”问题

2024-09-29 23:30:12 发布

您现在位置:Python中文网/ 问答频道 /正文

抱歉,我是新来的,所以如果这已经被覆盖,分享链接,因为我找不到它。在

我有一个csv,在文本查看器中显示如下。。。在

TeamCode,Name,ConferenceCode
5,Akron,875
8,Alabama,911
9,UAB,24312

我想把它和下面的内容一起导入词典

^{pr2}$

它回来了

["b'5'" "b'Akron'" "b'875'"]
["b'8'" "b'Alabama'" "b'911'"]
["b'9'" "b'UAB'" "b'24312'"]

我不知道为什么我会得到b。如果有更好的方法让我知道,但我正在尝试从csv创建字典,并认为这应该行得通。因为我拿到了b的东西,用字典的时候没有按计划工作。在

新建编辑。。。 我感谢所有的帮助,但是有人知道我为什么要得到b吗?当我导入numpy模块的时候,它出现了,其他一切都没问题。我用的是mac电脑,没有理由会这样对吧?在


Tags: csv方法name文本内容字典链接词典
3条回答

我相信这种任务不需要numpy,因为不管怎样,您都要将数据转换成Pythondict。您可以非常容易地自己实现解析:

with open('team.csv') as f:
    mydict = {k : [v, z] for k, v, z in (line.rstrip().split(',') for line in f)}

您可以解码,然后无需使用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']

你可以正常打开它:

^{pr2}$

或使用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

这是np.loadtxt中的一个错误,与python3区分字节字符串和文本字符串有关(see numpy issue #2715):它将CSV作为字节字符串处理,而CSV应该被视为文本。在

当然,正如padraiccunningham正确指出的那样,您不需要numpy来完成这个任务,可以使用csv模块。如果你想继续使用numpy,在修复错误之前,你有两个选择:

  1. 指定dtype=bytes,这将正确地将值解释为字节字符串。然后,把它们转换成真正的字符串。如果所有字段都是字符串,可以非常简洁地执行以下操作:

    key_value = np.loadtxt(
        'team.csv',
        delimiter=",",
        skiprows = 1,
        dtype = bytes
    ).astype(str)
    
  2. 在对np.loadtxt的调用中手动指定正确的转换器:

    key_value = np.loadtxt(
        'team.csv',
        delimiter=",",
        skiprows = 1,
        dtype = str,
        converters = {k:np.compat.asstr for k in range(3)}
    )
    

相关问题 更多 >

    热门问题