【问题标题】:How to read one column of a CSV file into a list of values如何将 CSV 文件的一列读入值列表
【发布时间】:2021-08-18 16:34:09
【问题描述】:

我在文件dm.txt中有以下数据

A|B|Name
VB|C|City
SDF|JK|Code

读取文件并索引到单独的配置文件的代码:

from configparser import ConfigParser
config = ConfigParser()
config.read("demo.ini")

# cutting the values of file from column 3 
keys = [ x.split("|")[2].rstrip("\n") for x in open(dm.txt).readlines()]
vals = [config["DEMFILE"][x] for x in keys]
print(vals)

它抛出错误:KeyError (keys)。如何将 CSV 的第三列读入列表?

【问题讨论】:

  • 关闭一个错误...索引从 0 开始,然后是 1,然后是 2 等等...所以您需要使用 2 而不是 3 作为第三个键。在此语句中 x.split("|")[3] 您要求拆分中的第 4 个项目,而拆分中只有 3 个项目,因此 keyError 消息

标签: python csv


【解决方案1】:

首先,dm.txt 需要用引号括起来——它是一个字符串,而不是一个对象,所以你的代码根本不会按原样运行,你应该很清楚 NameError 对此。

其次,请不要尝试手动解析 CSV,即使它们是微不足道的。使用builtin CSV library 并在每一行中访问row[2](第三列):

Python 3.9.0 (tags/v3.9.0:9cf6752, Oct  5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import csv
>>> with open("dm.csv", newline="") as csvfile:
...     reader = csv.reader(csvfile, delimiter="|")
...     keys = [row[2] for row in reader]
...
>>> keys
['Name', 'City', 'Code']

现在您可以使用keys 列表中的元素来key into your config file

【讨论】:

    【解决方案2】:

    我建议你把它写得更充分,并在你让它工作后重构它(例如,使用列表理解)。

    错误

    open 命令将文件作为字符串。因此应该是open("dm.txt", "r")

    注意

    这确实解决了原始问题,但使用此行时可能存在其他问题。这不是正确使用open 的方法。请改用相应的上下文管理器

    如前所述,一步一步写出你的代码,然后再重构它。

    解决方案

    with open("a.txt", "r") as f:
        keys = (line.split("|")[2].rstrip("\n") for line in f.readlines())
    

    【讨论】:

      【解决方案3】:

      因一个错误而关闭...索引从 0 开始,然后是 1,然后是 2 等等...所以您需要使用 2 而不是 3 作为第三个键。在此语句 x.split("|")[3] 中,您要求拆分中的第 4 项,而拆分中只有 3 项,因此出现 keyError 消息。

      我推荐使用

      keys = [ x.split("|")[2].rstrip("\n") for x in open("dm.txt").readlines()] 
      

      另外:

      尝试在 read() 和 open() 函数中使用完整路径 即:

      from configparser import ConfigParser
      config = ConfigParser()
      config.read("C:\\PathToIni\\demo.ini")
      
      # cutting the values of file from column 3 
      keys = [ x.split("|")[2].rstrip("\n") for x in open("C:\\PathToTxt\\dm.txt").readlines()]
      vals = [config["DEMFILE"][x] for x in keys]
      print(vals)
      

      这个输出:

      ["'XYZABC'", "'Kolkata'", "'123'"]
      

      对我来说使用这两个文件:

      dm.txt:

      A|B|Name
      VB|C|City
      SDF|JK|Code
      

      demo.ini

      [DEMFILE]
      Name='XYZABC'
      Surname='TYUIO'
      Code='123'
      City='Kolkata'
      

      这个答案还展示了如何创建一个通用的不可知的相对路径 Relative paths in Python

      【讨论】:

      • 我已经纠正了它的类型错误,然后它也失败了
      • 引发 KeyError(key)
      • 第一部分是他们在这里:stackoverflow.com/questions/68834778/… 只是在这里阅读这个问题,我从文件中得到它失败了
      • @SvenTUM 是正确的。 dm.txt 需要引用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2019-09-02
      • 1970-01-01
      相关资源
      最近更新 更多