【问题标题】:Create a dictionary using the row number in a csv file [Python]使用 csv 文件中的行号创建字典 [Python]
【发布时间】:2020-03-12 12:21:13
【问题描述】:

我有一个 CSV 文件,其中包含 60 位参与者的调查数据。第一列是参与者的编号,每个数字对应从该参与者收集的所有数据。它看起来像:

参与者人数:1,性别:女,学习程度:研究生

我想创建一个字典,其中键是参与者编号,值是包含所有数据的整个行,具有如下内容:

{1:女性,研究生,美国,是,否,否,是,是,否...}等等。我还是一个新手,到目前为止,这是我尝试过的:

with open('surveys.csv', 'r') as f:
    reader = csv.reader(f, delimiter=' ')
    with open('new_surveys.csv', mode='w') as outfile:
            writer = csv.writer(outfile)
            mydict = {rows[0]:rows for rows in reader}
            print(mydict)

但这会打印出类似的内容:

{'\ufeff"': ['\ufeff"'], '参与者/问题","1.': ['参与者/问题","1.', '性别'], ',2. ': [',2.', 'Level', 'of', 'study'],} 目前对我来说没有任何意义......

谢谢!

编辑:

这是一整行数据:

One complete row of data, there's 59 more but they all look the same only difference is Yes/No or time of day

【问题讨论】:

  • 你能在edit 的问题上添加with open('survey.csv', 'rb) as f:print(f.read(100)) 的输出吗?这应该让我们弄清楚列是如何分离的。
  • 嗨,很抱歉错过了这个。这是输出:"Participant/Question"",""1. Gender" ",2. Level of study" ",3. How often visit SC" ",4.
  • 这看起来不像 'rb' 模式的输出 - 我想查看字节以确切地查看 original 文件的情况构造。
  • 对不起,我完全错过了 'rb' 的事情,首先我收到一个关于打开字节的 csv.error,然后是:b'"Participant/Question"",""1. Gender"\t \t\t\t\r\n",2.学习水平"\t\t\t\t\r\n",3.多久访问一次SC"\t\t\t\t\r\ n",'
  • 我认为有很多解析问题,因为在我的 Counter 字典中,我有完整的“单词”,例如“是,否,有点”

标签: python python-3.x csv dictionary multidimensional-array


【解决方案1】:

你可以试试这个?

import csv
with open('surveys.csv', 'r') as f:
    reader = csv.reader(f, delimiter=' ') 
    mydict={}
    iterreader = iter(reader)
    next(iterreader)
    for row in iterreader:
        elementsList=row[0].split("\t")
        nonEmptyElements=[]
        for element in elementsList[1:]:
            print(element)          
            if(not element.strip()==""):
                nonEmptyElements.append(element)
        valuesList=",".join(nonEmptyElements)
        mydict[elementsList[0]]=valuesList
print(mydict)  

我的 CSV 看起来像这样

Participant Name    Gender
1   Rupin   Male
2   Poonam  Female
3   Jeshan  Male

代码避免使用第一行。

我的输出是这样的

{'1': 'Rupin,Male', '2': 'Poonam,Female', '3': 'Jeshan,Male'}

【讨论】:

  • 嗨,谢谢。它仍然显示得很奇怪:\n2,Male,UG,Daily,Afternoon,': 'Evening",Yes,Yes,Yes,"When,I,
  • 我更新了我的答案。我的 CSV 看起来像这样。参与者姓名 性别 1 Rupin 男 2 Poonam 女 3 Jeshan 男
  • 我不知道这是否与python在这一点上读取我的文件的方式有关,我有很多奇怪的逗号,它仍然看起来像这样:',,,,,,,, ,,\n1,Female,UG,Daily,Afternoon,': '晚上',Yes,"No',
  • 你能用 CSV 更新你原来的问题吗?
  • 您好,非常感谢您的帮助。我更新了第一行的图片,它们看起来都一样
【解决方案2】:

从comments,我们知道原始文件的前 100 个字节是:

b'\xef\xbb\xbf"\nParticipant/Question","1. Gender\n","2. Level of study\n","3. How often visit SC\n","4. Time of vi' 

这看起来像是从 Excel 导出的 csv,在单元格中嵌入了换行符。开头的b'\xef\xbb\xbf'是字节序标记,表示字节被编码为'utf-8-sig'。

基于此信息,此代码应创建所需的字典:

with open('surveys.csv', 'r', encoding='utf-8-sig') as f:
    reader = csv.reader(f, dialect='excel')
    # Advance the iterator to skip the header row
    next(reader)
    mydict = {row[0]:row for row in reader}
print(mydict)

传递“utf-8-sig”编码可确保字节顺序标记不会被视为数据的一部分。如果您使用 Excel,则在读取和写入 csv 文件时设置此编码可能是个好主意。

将dialect='excel' 传递给阅读器告诉它使用与Excel 创建的csv 文件相关联的defaults,例如使用逗号作为分隔符。

【讨论】:

  • 此答案可能会将数据放入您想要的 row_number:row 字典中。如果要将单元格拆分为单个单词,则需要在每个单元格上调用 .split(),也许使用 nltk 的标记器。如果字典看起来有问题,请在此处留下评论以及“错误”键/值对的示例。
猜你喜欢
  • 1970-01-01
  • 2021-05-15
  • 2019-01-06
  • 2013-11-18
  • 2018-04-07
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多