在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的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中编写适用于 Windows 中的 Python 2.7+ 和 Python 3.3+ 的 .CSV 文件