【问题标题】:Getting one piece of info from a row of a csv file从一行 csv 文件中获取一条信息
【发布时间】:2017-07-31 18:51:12
【问题描述】:

我有一个如下所示的 csv 文件:

name1, id1, email1, uID1
name2, id2, email2, uID2
name3, id3, email3, uID3
name4, id4, email4, uID4
name5, id5, email5, uID5
name6, id6, email6, uID6

我想从中获取一封随机电子邮件。例如。我想要email4,只有email4。我怎么读进去?我不想要 name4 id4 和 uID4,只需 email4。

注意:我正在编写一种方法来执行此操作,并且希望返回 email4 而不是打印它。

我已经看到很多关于如何获取整行或整列的信息,但没有看到如何获取一行的一部分。我该怎么做?

我已经查看并尝试了此线程上的所有选项:How can I get a specific field of a csv file? 但答案对我不起作用。所以新的解决方案或解决方案的修复会很棒!

这是我现在所在的位置:

num = random.randint(1,11)
    with open('Accounts_details.csv', 'rb') as f:
        reader = csv.reader(f)
        reader = list(reader)
        text = reader[num][2]
        print(text)

这会引发错误:

 reader = list(reader)
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

【问题讨论】:

    标签: python csv


    【解决方案1】:

    pandas 可能是最简单的方法。从您的帖子中不清楚您是想要特定字段还是随机字段,但两者都非常简单。

    import pandas as pd
    df = pd.read_csv(<your_file>)
    
    print(df.iloc[4]['email'])
    

    您可以随机生成 4 并将其用于索引,或者如果需要多个,则直接使用来自 pandasrandom.sample

    【讨论】:

    • 我希望它是随机的,但我有在其他地方选择随机的功能。而“电子邮件”部分是标题?或者电子邮件指向什么?
    • @HoldenMalinchock 是的,email 只是标题。
    • 没有标头怎么办。我的 csv 文件看起来和上面的一样,只是包含真实信息。
    • 我需要去为它创建标题吗?
    • @HoldenMalinchock 您应该这样做,否则您可以按列索引进行索引,但这很糟糕,原因有很多。大多数情况下,在代码中引入幻数从来都不是一个好方法。
    【解决方案2】:

    您将其作为文本文件打开。

    这个:

    with open('Accounts_details.csv', 'rb') as f:  
    

    应该是这样的:

    with open('Accounts_details.csv', 'r') as f:  
    

    【讨论】:

      【解决方案3】:

      您可以使用 numpy-library,完整示例:

      import io
      import numpy as np
      
      test = """name1, id1, email1, uID1
      name2, id2, email2, uID2
      name3, id3, email3, uID3
      name4, id4, email4, uID4
      name5, id5, email5, uID5
      name6, id6, email6, uID6"""
      
      with open("test.txt", "w") as f:
          f.write(test)
      
      data = np.genfromtxt("test.txt", delimiter="," ,dtype='unicode', autostrip=True)
      # np.random.choice(data[:,2]) <-- random choice
      data[:,2][4] # <--- index
      

      更新:numpy和pandas的时间对比

      %timeit np.genfromtxt("test.txt", delimiter="," ,dtype='unicode', autostrip=True)
      # 1000 loops, best of 3: 404 µs per loop
      
      %timeit pd.read_csv("test.txt", header=None, skipinitialspace=True)
      1000 loops, best of 3: 954 µs per loop
      

      【讨论】:

      • Numpy 是熊猫的一部分? AKA 我不需要安装它?>
      • @HoldenMalinchock 不,抱歉,打错字了。我正在计时这两种选择。
      • 不用随机选择法也能看吗?就像我已经有了随机数并插入它一样?此外,我使用的是 csv 文件而不是文本文件,因此不会对 genfromtxt 进行重新调整。
      • @HoldenMalinchock csv 文件是一个 txt 文件(以 *.csv 结尾) - 只需使用 genfromtxt("filename.csv"..)。如果您需要索引,只需输入它,因为 data[:,2] 是包含所有电子邮件的列。
      • @AntonvBR 非常具有欺骗性的基准。在这两个代码 sn-ps 中,您根本没有做同样的事情。你应该 A) 与 IO 分离,B) 让两个 sn-ps 做同样的事情。
      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      相关资源
      最近更新 更多