在python中读取CSV时使用双引号的换行符

在python中读取CSV时使用双引号的换行符,python,csv,pandas,Python,Csv,Pandas,我有以下格式的csv文件: "4931286","Lotion","New York","Bright color, yellow with 5" long 20% nylon" "931286","Shampoo","New York","Dark, yellow with 10" long 20% nylon" "3931286","Conditioner","LA","Bright color, yellow with 5" long 50% nylon" 以上数据应读为3行4列:ID、

我有以下格式的csv文件:

"4931286","Lotion","New York","Bright color, yellow with 5" long
20% nylon"
"931286","Shampoo","New York","Dark, yellow with 10" long
20% nylon"
"3931286","Conditioner","LA","Bright color, yellow with 5" long
50% nylon"
以上数据应读为3行4列:ID、产品名称、位置和描述。可以看出,每一行的描述中都有新行

我一直在搜索其他相关的stackoverflow问题,但没有一个解决方案能够解决这个问题

以下是我的尝试:

from StringIO import StringIO
file = StringIO("""4931286","Lotion","New York","Bright color, yellow\n   with 5" long 20% nylon""")

for row in csv.reader(file,quotechar='"', delimiter=',',quoting=csv.QUOTE_ALL, skipinitialspace=True):
 print row
结果如下所示:

['4931286"', 'Lotion', 'New York', 'Bright color, yellow with 5 long']
   ['20% nylon']
但是,我想要的是

['4931286"', 'Lotion', 'New York', 'Bright color, yellow with 5 long 20% nylon']

我怎样才能做到这一点?python中应该有一种方法?

每两行迭代一次怎么样

import csv
from StringIO import StringIO
from itertools import izip

def pairwise(iterable):
    "s -> (s0, s1), (s2, s3), (s4, s5), ..."
    a = iter(iterable)
    return izip(a, a)


file = StringIO(""""4931286","Lotion","New York","Bright color, yellow with 5" long
20% nylon"
"931286","Shampoo","New York","Dark, yellow with 10" long
20% nylon"
"3931286","Conditioner","LA","Bright color, yellow with 5" long
50% nylon"
""")

reader = csv.reader(file,quotechar='"', delimiter=',',quoting=csv.QUOTE_ALL, skipinitialspace=True)
for row, row2 in pairwise(reader):
    row[-1] = ' '.join([row[-1], row2[0]])
    print(row)

# Output
['4931286', 'Lotion', 'New York', 'Bright color, yellow with 5 long 20% nylon"']
['931286', 'Shampoo', 'New York', 'Dark, yellow with 10 long 20% nylon"']
['3931286', 'Conditioner', 'LA', 'Bright color, yellow with 5 long 50% nylon"']

数据不是CSV格式

CSV中的
必须用
\
转义,如
“明亮的颜色,黄色\n和5\“长的20%尼龙”

如果
仅用于英寸(前缀为数字),请尝试以下操作:

import re
data = re.sub(r'([0-9])"(?![,\n])', r'\1\\"', data)
如果前缀为数字,则此正则表达式将所有
替换为
\”

然后使用
csv.reader


编辑:由于更改了正则表达式。

我可能是因为您有一个格式正确的CSV文件并对其进行了解析,或者您正试图将其破解,您应该为您的具体案例编写一个不同的解析函数。pandas有何相关性?您的数据是否来自pandas?如果是,我很惊讶,因为我同意其他人的说法您的CSV无效。我不希望pandas生成与您一样的数据。我认为您不会在内置的
CSV
模块中找到方言设置的任何组合来准确处理您的数据。啊,很抱歉造成混淆。数据来自使用sql Workbench的sql数据库。我包括pandas标记只是为了以防万一读取csv函数可能可以解决这个问题。我认为您还应该确保不会像这样转义字符串:
“Column 1”,“Column 2”
,也就是说,如果在
之后有
[,\n]
,那么就不应该这样escaped@user4279562不客气。如果答案有助于解决问题,请考虑接受答案。这不是一个可靠的解决方案。如果有另一个新行,函数就会中断。不过,它可以用于问题中的场景和示例数据。