Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python使用带有2个分隔符的CSV_Python_Text_Delimiter_Import From Csv - Fatal编程技术网

Python使用带有2个分隔符的CSV

Python使用带有2个分隔符的CSV,python,text,delimiter,import-from-csv,Python,Text,Delimiter,Import From Csv,我有一个将数据输出到CSV文件的程序。这些文件包含两个分隔符,分别为和“”表示文本。文本还包含逗号 如何使用这两个分隔符 我当前的代码使我的列表索引超出范围。如果需要CSV文件,我可以提供 当前代码: def readcsv(): with open('pythontest.csv') as csvfile: dialect = csv.Sniffer().sniff(csvfile.read(1024),delimiters=',"') csvfile.seek(0)

我有一个将数据输出到CSV文件的程序。这些文件包含两个分隔符,分别为和“”表示文本。文本还包含逗号

如何使用这两个分隔符

我当前的代码使我的列表索引超出范围。如果需要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文件:

它似乎在处理第二条线路方面有问题。如果我把这些行附加到一个列表中,第一行看起来是可以的,但第二行似乎把它作为一个整体,不再分隔逗号。
我想这与“输入”有关,我不认为您需要定义自定义方言,除非我遗漏了什么

显示您可以将
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
是删除了
引号的行中每个项目的字符串列表


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

好的,我想我了解您正在阅读的文件类型……假设您的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"
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  
这是允许您逐行读取的代码,引号中的文本将作为单个数组元素取出,但不会拆分。您需要的参数是thisquoting=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"
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解决方案基于最新的官方文档,请参见此处

像这样的快速解决方案如何 这是一个快速修复方法,可以将csv中的一行像“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

请添加几行您正在阅读的CSV文件。它确实看起来像这样。我不知道您是否自己尝试过它,但输出与我在Python3中测试的不一样,我的版本是Python3.5.2,在终端中尝试此测试$Python3 readcsv.pyi制作了一个不同的CSV文件,结果相同我使用了不同的较小的CSV file以更好地显示结果。下面的屏幕截图是您的代码。我感觉问题出在您的csv文件上。我看到您在Windows上,请右键单击该文件并选择“编辑”,然后显示该文件的内容。当使用电子表格程序打开csv文件时,它应该将数据放入自己的列中:。但是,从您的屏幕截图它们都在同一列中。如果我用libreoffice打开CSV文件,所有内容都会正确显示,就像你的屏幕截图一样。如果我用记事本++()打开CSV文件,有多个引号在用excel打开时不会显示,有办法解决这个问题吗?