Python 删除csv文件中的换行符

Python 删除csv文件中的换行符,python,regex,csv,line-breaks,Python,Regex,Csv,Line Breaks,我有一个带有行的csv文件,每行以(@)开头,一行中的所有字段以(;)分隔。其中一个包含“文本”(“[]”)的字段有一些换行符,在将整个csv文件导入excel或access时会产生错误。换行符后的文本被视为独立的行,不遵循表的结构 @4627289301; Lima, Peru; 490; 835551022915420161; Sat Feb 25 18:04:22 +0000 2017; ""[OJO! la premiacin de los #Oscar, nuestros amigos

我有一个带有行的csv文件,每行以(@)开头,一行中的所有字段以(;)分隔。其中一个包含“文本”(“[]”)的字段有一些换行符,在将整个csv文件导入excel或access时会产生错误。换行符后的文本被视为独立的行,不遵循表的结构

@4627289301; Lima, Peru; 490; 835551022915420161; Sat Feb 25 18:04:22 +0000 2017; ""[OJO!
la premiacin de los #Oscar, nuestros amigos de @cinencuentro revisan las categoras.
+info: co/plHcfSIfn8]""; 0
@624974422; None; 114; 835551038581137416; Sat Feb 25 18:04:26 +0000 2017; ""[Porque nunca dejamos de amar]""; 0
使用python脚本对此有帮助吗?或任何其他解决方案

作为输出,我希望有以下行:

@4627289301; Lima, Peru; 490; 835551022915420161; Sat Feb 25 18:04:22 +0000 2017; ""[OJO! la premiacin de los #Oscar, nuestros amigos de @cinencuentro revisan las categoras. +info: co/plHcfSIfn8]""; 0
@624974422; None; 114; 835551038581137416; Sat Feb 25 18:04:26 +0000 2017; ""[Porque nunca dejamos de amar]""; 0

有什么帮助吗?我有一个csv文件(54MB),其中有很多行带有换行符。。。其他行也可以…

您也应该分享您的预期输出

无论如何,我建议您首先清理文件以删除换行符。然后您可以将其读取为csv。一个解决方案是(我相信有人会提出更好的建议:-)

清理文件(在linux上):

sed ':a;N;$!ba;s/\n/ /g' input_file | sed "s/ @/\n@/g" > output_file
将文件读取为csv(您可以使用任何其他方法读取)


让我们看看它是否对您有帮助:-)

您也应该分享您的预期输出

无论如何,我建议您首先清理文件以删除换行符。然后您可以将其读取为csv。一个解决方案是(我相信有人会提出更好的建议:-)

清理文件(在linux上):

sed ':a;N;$!ba;s/\n/ /g' input_file | sed "s/ @/\n@/g" > output_file
将文件读取为csv(您可以使用任何其他方法读取)


让我们看看它是否对您有帮助:-)

您可以搜索后跟不以“@”开头的行的行,例如
\r?\n+(?!@\d+;)

以下是从这个regex101生成的。它用一个空格替换这样的线的端点。你可以随意改变

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"\r?\n+(?!@\d+;)"

test_str = ("@4627289301; Lima, Peru; 490; 835551022915420161; Sat Feb 25 18:04:22 +0000 2017; \"\"[OJO!\n"
    "la premiacin de los #Oscar, nuestros amigos de @cinencuentro revisan las categoras.\n"
    "+info: co/plHcfSIfn8]\"\"; 0\n"
    "@624974422; None; 114; 835551038581137416; Sat Feb 25 18:04:26 +0000 2017; \"\"[Porque nunca dejamos de amar]\"\"; 0")

subst = " "

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

您可以搜索后跟不以“@”开头的行的行,例如
\r?\n+(?!@\d+;)

以下是从这个regex101生成的。它用一个空格替换这样的线的端点。你可以随意改变

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"\r?\n+(?!@\d+;)"

test_str = ("@4627289301; Lima, Peru; 490; 835551022915420161; Sat Feb 25 18:04:22 +0000 2017; \"\"[OJO!\n"
    "la premiacin de los #Oscar, nuestros amigos de @cinencuentro revisan las categoras.\n"
    "+info: co/plHcfSIfn8]\"\"; 0\n"
    "@624974422; None; 114; 835551038581137416; Sat Feb 25 18:04:26 +0000 2017; \"\"[Porque nunca dejamos de amar]\"\"; 0")

subst = " "

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.


还有,评论中的@是不可以考虑的,是吗?我想把所有的行都组织成例子的第二行(@624914422…),你试过什么吗?似乎有一个相当简单的方法开始。逐行阅读,丢弃
@
并按
拆分或使用csv模块。重复的双引号看起来完全是错误的。CSV的一些方言允许在带引号的字符串中使用换行符,但它们应该在每边用一个双引号字符包装,而不是两个。此外,注释中的@不应该被考虑,是吗?我想把所有的行都结构化为示例的第二行(@624914422…),你试过什么吗?似乎有一个相当简单的方法开始。逐行阅读,丢弃
@
并按
拆分或使用csv模块。重复的双引号看起来完全是错误的。CSV的某些方言允许在带引号的字符串中使用换行符,但它们的每边都应该使用一个双引号字符,而不是两个。感谢@PaulRooneyThank@PaulRooneyIt不起作用,演示在创建代码时将一些字符添加到真实的文本行…@luisec我不明白这意味着什么?如果它只是意味着它在添加一个空格,那是因为
subst=“”
,您可以将其更改为“”,或者在文本“OJO!”后的第一行中替换它,演示在使用示例导出代码时会添加“\n”(在演示中,我已经尝试过了)。。。原始行没有这些字符来标识换行符的位置…@luisec
\n
仅表示字符串对象中的换行符。它只存在于样品中。许多语言都支持这一点。如果您查看demo@您将看到示例文本没有文本
\n
。这就是regex101生成示例代码的方式。它不起作用,演示在创建代码时会在实际文本行中添加一些字符…@luisec我不明白这意味着什么?如果它只是意味着它在添加一个空格,那是因为
subst=“”
,您可以将其更改为“”,或者在文本“OJO!”后的第一行中替换它,演示在使用示例导出代码时会添加“\n”(在演示中,我已经尝试过了)。。。原始行没有这些字符来标识换行符的位置…@luisec
\n
仅表示字符串对象中的换行符。它只存在于样品中。许多语言都支持这一点。如果您查看demo@您将看到示例文本没有文本
\n
。这就是regex101生成示例代码的方式。