Python 读取包含在双引号中但带有换行符的csv文件

Python 读取包含在双引号中但带有换行符的csv文件,python,python-2.7,apache-spark,pyspark,Python,Python 2.7,Apache Spark,Pyspark,我有csv,列中有换行符。下面是我的示例: "A","B","C" 1,"This is csv with newline","This is another column" "This is newline and another line","apple","cat" 我可以在spark中读取文件,但列中的换行符被视为单独的一行 如何将其准备为csv,并将文本括在双引号内 我只使用apachecsv插件和apache读取文件 alarms = sc.textFile("D:\Datase

我有
csv
,列中有换行符。下面是我的示例:

"A","B","C"
1,"This is csv with 
newline","This is another column"
"This is newline
and another line","apple","cat"
我可以在spark中读取文件,但列中的换行符被视为单独的一行

如何将其准备为csv,并将文本括在双引号内

我只使用apachecsv插件和apache读取文件

alarms = sc.textFile("D:\Dataset\oneday\oneday.csv")
这给了我RDD:

**example.take(5)**

[u'A,B,C', u'1,"This is csv with ', u'newline",This is another column', u'"This is newline', u'and another line",apple,cat']

Spark版本:1.4

标准python库中的csv模块可实现开箱即用:

>>> txt = '''"A","B","C"
1,"This is csv with 
newline","This is another column"
"This is newline
and another line","apple","cat"'''
>>> import csv
>>> import io
>>> with io.BytesIO(txt) as fd:
    rd = csv.reader(fd)
    for row in rd:
        print row


['A', 'B', 'C']
['1', 'This is csv with \nnewline', 'This is another column']
['This is newline\nand another line', 'apple', 'cat']
这可用于
二进制文件
(对
文本文件
的性能有显著影响):

>>> (sc.binaryFiles(path)
        .values()
        .flatMap(lambda x: csv.reader(io.BytesIO(x))))

标准python库中的csv模块可直接执行以下操作:

>>> txt = '''"A","B","C"
1,"This is csv with 
newline","This is another column"
"This is newline
and another line","apple","cat"'''
>>> import csv
>>> import io
>>> with io.BytesIO(txt) as fd:
    rd = csv.reader(fd)
    for row in rd:
        print row


['A', 'B', 'C']
['1', 'This is csv with \nnewline', 'This is another column']
['This is newline\nand another line', 'apple', 'cat']
这可用于
二进制文件
(对
文本文件
的性能有显著影响):

>>> (sc.binaryFiles(path)
        .values()
        .flatMap(lambda x: csv.reader(io.BytesIO(x))))

您不需要导入任何内容。下面提出的解决方案创建第二个文件只是为了演示。您可以在修改后读取该行,而无需在任何地方写入

with open(r'C:\Users\evkouni\Desktop\test_in.csv', 'r') as fin:
    with open(r'C:\Users\evkouni\Desktop\test_out.csv', 'w') as fout:
        cont = fin.readlines()
        for line in cont[:-1]:
            if line.count('"') % 2 == 1 and '"\n' not in line:
                line = line.replace('\n', '')
            fout.write(line)

#DEMO

#test_in.csv
#------------
#"A";"B";"C"
#1;"This is csv with 
#newline";"This is another column"
#"This is newline

#test_out.csv
#------------
#"A";"B";"C"
#1;"This is csv with newline";"This is another column"
#"This is newline

如果您有什么不清楚的地方,请告诉我。

您不需要导入任何内容。下面提出的解决方案创建第二个文件只是为了演示。您可以在修改后读取该行,而无需在任何地方写入

with open(r'C:\Users\evkouni\Desktop\test_in.csv', 'r') as fin:
    with open(r'C:\Users\evkouni\Desktop\test_out.csv', 'w') as fout:
        cont = fin.readlines()
        for line in cont[:-1]:
            if line.count('"') % 2 == 1 and '"\n' not in line:
                line = line.replace('\n', '')
            fout.write(line)

#DEMO

#test_in.csv
#------------
#"A";"B";"C"
#1;"This is csv with 
#newline";"This is another column"
#"This is newline

#test_out.csv
#------------
#"A";"B";"C"
#1;"This is csv with newline";"This is another column"
#"This is newline

如果您有什么不清楚的地方,请让我知道。

如果您想从csv创建数据框,并使用换行符和双引号引用,而无需重新创建轮子,请使用spark csv和通用csv库:

from pyspark.sql import SQLContext
df = sqlContext.load(header="true",source="com.databricks.spark.csv", path = "hdfs://analytics.com.np:8020/hdp/badcsv.csv")

如果您想从带有换行符的csv创建数据帧,并以双引号引用,而无需重新创建轮子,请使用spark csv和通用csv库:

from pyspark.sql import SQLContext
df = sqlContext.load(header="true",source="com.databricks.spark.csv", path = "hdfs://analytics.com.np:8020/hdp/badcsv.csv")


line.replace('/n','')如果line.count(''')%2==1且'\n'不在行中\n'不符合要求
虽然这是一个很好的答案,但一般来说,它并不能真正解决特定的上下文。@zero323这到底是什么意思?@zero323 OP没有说他在阅读spark中的CSV时有任何问题。他的问题是列条目中的新行字符。虽然我不熟悉spark,但我还是不明白你的意思。你会如何在spark中使用?特别是,您必须使用分布式数据和不可移植的数据结构。可以用与@SergeBallesta编写的代码类似的方式进行调整,但这远远不是一个有效的解决方案。@zero323只是为了让我们不再追尾。。你能引用OP的话吗?虽然这是一个很好的答案,但它并没有真正针对特定的上下文。@zero323这到底是什么意思?@zero323 OP没有说他在阅读spark中的CSV时有任何问题。他的问题是列条目中的新行字符。虽然我不熟悉spark,但我还是不明白你的意思。你会如何在spark中使用?特别是,您必须使用分布式数据和不可移植的数据结构。可以用与@SergeBallesta编写的代码类似的方式进行调整,但这远远不是一个有效的解决方案。@zero323只是为了让我们不再追尾。。你能引用你的话吗?@zero323:谢谢你改进了我的答案。我很了解csv模块,因为我不能对spark说同样的话…@zero323:谢谢你改进了我的答案。我很了解csv模块,因为我不能说spark也一样…commons的csv解析器在newline上会失败,不是吗?你是说univocity吗?@zero323你需要加载spark csv,否则如果你使用common-csv,它将失败。这不是我的意思<据我记忆所及,code>commons解析器不处理多行记录<代码>统一性没有。两者都使用
spark csv
,虽然这在2.0+@zero323中或多或少被弃用,但我使用的是spark 1.4。是的,我不能用commons完成它。你指的是谁的2.0+版本?火花是否已去润滑。而且,我也找不到它是否被去除了润滑油!使用这个有没有性能损失?Spark 2.0+。它只是在核心库中提供csv支持,不会有任何惩罚。commons的csv解析器在换行时会失败,不是吗?你是说univocity吗?@zero323你需要加载spark csv,否则如果你使用common-csv,它将失败。这不是我的意思<据我记忆所及,code>commons解析器不处理多行记录<代码>统一性没有。两者都使用
spark csv
,虽然这在2.0+@zero323中或多或少被弃用,但我使用的是spark 1.4。是的,我不能用commons完成它。你指的是谁的2.0+版本?火花是否已去润滑。而且,我也找不到它是否被去除了润滑油!使用这个有没有性能损失?Spark 2.0+。它只是在核心库中提供csv支持,没有任何惩罚。