【问题标题】:Python working with CSV with 2 delimitersPython 使用带有 2 个分隔符的 CSV
【发布时间】:2017-04-25 08:08:02
【问题描述】:

我有一个程序可以将数据输出到 CSV 文件中。这些文件包含 2 个分隔符,分别是 , 和 "" 用于文本。文本还包含逗号。

如何使用这 2 个分隔符?

我当前的代码使我的列表索引超出范围。如果需要 CSV 文件,我可以提供。

当前代码:

def readcsv():
with open('pythontest.csv') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024),delimiters=',"')
    csvfile.seek(0)
    reader = csv.reader(csvfile,dialect)
    for row in reader:
        asset_ip_addresses.append(row[0])
        service_protocollen.append(row[1])
        service_porten.append(row[2])
        vurn_cvssen.append(row[3])
        vurn_risk_scores.append(row[4])
        vurn_descriptions.append(row[5])
        vurn_cve_urls.append(row[6])
        vurn_solutions.append(row[7])

我正在使用的 CSV 文件:http://www.pastebin.com/bUbDC419

处理第二行似乎有问题。如果我将行附加到列表中,第一行似乎没问题,但第二行似乎将其视为整体,不再分隔逗号。 我想这与“进入”有关

【问题讨论】:

标签: python text delimiter import-from-csv


【解决方案1】:

我认为您不需要定义自定义方言,除非我遗漏了什么。

official documentation 表明您可以将quotechar 作为关键字提供给reader() 方法。为您的代码修改的文档中的示例:

import csv
with open('pythontest.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
        #do something to the row

row 是删除了" 引号的行中每个项目的字符串列表。

索引超出范围的问题表明无法访问row[x] 之一。

【讨论】:

  • 我使用了一个不同的较小的 CSV 文件来更好地显示结果。以下屏幕截图是您的代码i.imgur.com/Fi13URw.png
  • 我感觉问题出在您的 csv 文件上。我看到你在 Windows 上,请右键单击文件并选择编辑,然后显示文件的内容。当使用电子表格程序打开 csv 文件时,它应该将数据放入它自己的列中:i.imgur.com/yTH5MFz.png。但是,从您的屏幕截图来看,它们都在同一列中。
  • 如果我使用 libreoffice 打开 CSV 文件,一切都会正确显示,就像您的屏幕截图一样。如果我使用记事本++ (i.imgur.com/h8XeBof.png) 打开 csv 文件,使用 excel 打开时不会显示多个引号,有没有办法解决这个问题?
【解决方案2】:

好的,我想我了解您正在阅读的文件类型...假设您的 CSV 文件的内容如下所示

192.168.12.255,"Great site, a lot of good, recommended",0,"Last, first, middle"
192.168.0.255,"About cats, dogs, must visit!",1,"One, two, three"

这是允许您逐行阅读的代码,引号中的文本将作为单个数组元素取出,但不会拆分它。您需要的参数是这个 quoting=csv.QUOTE_ALL

import csv

with open('students.csv', newline='') as f:
    reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_ALL)
    for row in reader:
        print(row[0]) 
        print(row[1])      
        print(row[2])  
        print(row[3])     

打印出来的效果是这样的

192.168.12.255                                                                                                       
Great site, a lot of good, recommended                                                                               
0                                                                                                                    
Last, first, middle                                                                                                  
192.168.0.255                                                                                                        
About cats, dogs, must visit!                                                                                        
1                                                                                                                    
One, two, three  

PS解决方案基于最新的官方文档,看这里https://docs.python.org/3/library/csv.html

【讨论】:

  • 看起来确实如此。不知道你有没有自己试过但是输出不是这样的
  • 我在Python3中测试过,我的版本是Python 3.5.2,在终端试试这个测试一下$ python3 readcsv.py
【解决方案3】:

这样的快速解决方案怎么样 一个快速修复,将 csv 中的一行像 a,"b,c",d 拆分为字符串 a,b,c,d

def readcsv():
with open('pythontest.csv') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024),delimiters=',"')
    csvfile.seek(0)
    reader = csv.reader(csvfile,dialect)
    for rowx in reader:
       row=[e.split(r',') if isinstance(e,str) else e for e in rowx]
       #do your stuff on row

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 2019-07-08
相关资源
最近更新 更多