在python中识别csv

Posted

技术标签:

【中文标题】在python中识别csv【英文标题】:identify csv in python 【发布时间】:2017-01-30 11:09:27 【问题描述】:

我有一个“混乱”的 CSV 数据转储。 (大约 100 个文件,每个文件包含大约 1000 行实际 CSV 数据。) 除了 CSV 之外,转储还有一些其他文本。如何以编程方式单独提取 CSV 部分?

作为一个例子,数据文件看起来像这样

Session:1
Data collection date: 09-09-2016
Related questions:
    Question 1: parta, partb, partc,
    Question 2: parta, partb, partc

"field1","field2","field3","field4"
"data11","data12","data13","data14"
"data21","data22","data23","data24"
"data31","data32","data33","data34"
"data41","data42","data43","data44"
"data51","data52","data53","data54"

我需要提取 csv 部分。

注意事项, 开头的文字不限于 4 - 5 行。 附加文本不只是在文件的开头

我看到this post 建议使用 re.split 和/或 csv.Sniffer, 但是我的尝试没有结果。

with open("untitled.csv") as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    print(dialect.__dict__)
    csvstarts = False
    csvdump = []
    for ln in csvfile.readlines():
        toks = re.split(r'[,]', ln)
        print(toks)
        if toks[0] == '"field1"' and not csvstarts: # identify by the header line
            csvstarts = True
            continue
        if csvstarts:
            if toks[0] == '"field1"': # identify the start of subsequent csv data
                csvstarts = False
                continue
            csvdump.append(ln)  # record the current line

    print(csvdump)

目前,只有当有一堆数据时,我才能准确识别 csv 行。

有什么更好的办法吗?

【问题讨论】:

那么是什么分隔数据行和文本行呢?文本行可以以“吗? 所以,这就是问题所在,没有任何东西可以将 csv 数据与文本分开,除非您将空行视为分隔符。 【参考方案1】:

这个怎么样:

import re

my_pattern = re.compile("(\"[\w]+\",)+")

with open('<your_file>', 'rb') as fi:
    for f in fi:
        result = my_pattern.match(f)
        if result:
            print f

假设 csv 数据可以通过其中没有特殊字符来与其他数据区分开来(我们只接受每个元素都有字母或数字,用双引号括起来,并用逗号分隔下一个元素)

【讨论】:

自我注意:必须学习如何使用正则表达式...更好的答案! 乐于助人。如果它解决了您的问题,您可以接受答案。 很抱歉。 这是最接近这项工作的。正则表达式中的一个小修复是检查这是否是下面@Mrd05d 建议的行的开始和结束。因此接受。如果我能做得更好,我会更新【参考方案2】:

如果您的 csv 行并且只有那些行以 \" 开头,那么您可以这样做:

import csv

data = list(csv.reader(open("test.csv", 'rb'), quotechar='¬'))
# for quotechar - use something that won't turn up in data

def importCSV(data):
    # outputs list of list with required data
    # works on the assumption that all required data starts with \"
    # and that no text starts with \"

    out = []

    for line in data:
        if (line != []) and (line[0][0] == "\""):
            line = [el.replace("\"", "") for el in line]
            out.append(line)

    return out

useful = importCSV(data)

【讨论】:

【参考方案3】:

您不能阅读每一行并执行正则表达式来查看天气或不提取数据吗? 可能是这样的:

^(["][\w]["][,])+["][\w]["]$

我的正则表达式不是最好的,可能有更好的方法,但这似乎对我有用。

【讨论】:

以上是关于在python中识别csv的主要内容,如果未能解决你的问题,请参考以下文章

在 csv python 中排序、分组和计算平均值

将多个列表写入 csv Python

CSV Python 列表

在 Python 中编写适用于 Windows 中的 Python 2.7+ 和 Python 3.3+ 的 .CSV 文件

读取csv python时列出索引超出范围

XML 转 CSV Python 3.5.2