当前位置: 首页 > 知识库问答 >
问题:

读取列之间具有换行符的csv文件

骆雅昶
2023-03-14

我已经使用熊猫读取和解析csv文件,列由分号分隔。一些文件在某些列之后有(出于未知原因)一个'\r\n'序列,这使得pandas.read_csv将它们拆分为不同的行。我想转义这些字符并将“第二行”附加到“第一行”,否则之后解析会变得困难。

我可以识别这些行,因为它们后面是数字,而正确的第一列包含时间,如00:00:00。熊猫有可能做到这一点吗。是否读取csv?

实例

如果文件正确,我的代码如下所示:

data = io.StringIO( ''' a; b; c; d 
                    x10; 20; 30; 40
                    x11; 21; 31; 41
                    x12; 22; 32; 42
                    x13; 23; 33; 43
                    x14; 24; 34; 44
                    x15; 25; 35; 45
                 ''' )

pd.read_csv( data, sep=';' )

输出:

    a   b   c   d
0   10  20  30  40
1   11  21  31  41
2   12  22  32  42
3   13  23  33  43
4   14  24  34  44
5   15  25  35  45

问题

如果文件已损坏,则如下所示:

data = io.StringIO( ''' a; b; c; d 
                        x10; 20; 30; 40
                        x11; 21; 31; 41
                        x12; 22; 
                        32; 42
                        x13; 23; 33; 43
                        x14; 24; 34; 44
                        x15; 25; 35; 45
                     ''' )

pd.read_csv( data, sep=';' )

输出:

    a   b   c   d
0   x10     20  30  40.0
1   x11     21  31  41.0
2   x12     22      NaN
3   32  42  NaN     NaN
4   x13     23  33  43.0
5   x14     24  34  44.0
6   x15     25  35  45.0

然而,在这两种情况下,预期输出都是第一个输出。在本例中,我想在pandas中构建数据帧之前/期间,用\r\n\d\d替换\r\n\d\d,以除去这些换行符。

如果可能的话,我希望避免先修复文件,避免在与熊猫一起阅读之前制作额外的脚本来检查所有文件,因为有新文件定期出现。

在熊猫中读取csv文件时是否可以替换部分字符串?

有没有其他方法来解决这种问题?

使用python 3.6.8,熊猫0.24.2

共有2个答案

漆雕疏珂
2023-03-14

我从ivallesp的答案中得到了部分信息,并想出了一个解决方案,可以保留断开的线。

我将其作为文档发布在这里,以供未来的我(往往会忘记这些事情)以及可能遇到类似问题的其他人使用。

错误的文件,带虚线

infile = io.StringIO( ''' a; b; c; d 
                        x10; 20; 30; 40
                        x11; 21; 31; 41
                        x12; 22; 
                        32; 42
                        x13; 23; 33; 43
                        x14; 24; 34; 44
                        x15; 25; 35; 45
                     ''' )

# The lines are joined with a \n, and whitespace stripped
data = '\n'.join( [ item.strip() for item in infile ] )
# Now data is not a file stream, but a string, with \n s in between

#Search for occurrences of newline + NOT(x + number) and just keep
# found group 
data = re.sub( '\n(?!x\d\d)', '\1', data )

# Now data is a file stream again
data = io.StringIO( data )

# Fed to pandas.read_csv
pd.read_csv( data, sep=';' )

变异

由于磁盘中有一个实际的文件(不是io.StringIO),我不得不做一个小的修改,删除。strip(),不确定原因。除此之外,它还可以在无连接的情况下工作 )。

最后,我的实际文件在第一列中有时间,形式为00:0000:05等。所以我实际上是这样使用的:

import re

with open( 'broken_rows_file.csv', 'r' ) as infile:
    data = ''.join( [ item for item in infile ] )

#All that is NOT ##:## should be replaced
data = re.sub( '\n(?!\d\d:\d\d)', '\1', data ) 
data = io.StringIO( data )

df = pd.read_csv( data, sep=';' )
df

       a    b   c   d
0   00:10   20  30  40
1   00:11   21  31  41
2   00:12   22  32  42
3   00:13   23  33  43
4   00:14   24  34  44
5   00:15   25  35  45
向弘懿
2023-03-14

这是大型CSV常见的情况。解决这个问题的方法是使用python读取它们,并检查分隔符的数量是否与您期望的匹配,否则删除该行。然后,更正原始数据后,可以使用StringIO将其加载到pandas中。在错误的示例上添加一个示例:

# We load the file
filestream = open(filepath)

# Now we filter the data as follows
data = filter(lambda l: l.count(";")==3, filestream)

# Now we convert to String IO
stream = io.StringIO("\n".join(data))

# And finally we read with Pandas
pd.read_csv(stream, sep=';' )
 类似资料:
  • 问题内容: 所以我正在解析.csv文件。我接受了StackOverflow上另一个线程的建议,并下载了SuperCSV。我终于使几乎所有的东西都能正常工作,但是现在我遇到了一个似乎很难修复的错误。 发生此问题的原因是可能填充了最后两列数据,也可能未填充。这是一个.csv文件的示例,第一行缺少最后一列,第二行完全完成: 2012:07:25,11:48:20,922,“ uLog.exe”,“”,按

  • 我想从多列csv文件中读取特定列,并使用Java在其他csv文件中打印这些列。需要帮忙吗?下面是我逐行打印每个令牌的代码。。但我希望只打印多列csv中的几列。

  • 问题内容: 在Python中,调用 产生一个列表,其中每个元素都是文件中的一行。这有点愚蠢,但是仍然:还为每个元素写换行符,这是我不希望发生的事情。 如何避免呢? 问题答案: 您可以使用读取整个文件并分割行: 或者,您可以手动删除换行符: 注意:仅当文件以换行符结尾时,后一种解决方案才有效,否则最后一行将丢失字符。 在大多数情况下,此假设是正确的(尤其是对于文本编辑器创建的文件,这些文件通常确实会

  • 问题内容: 我有以下测试(格式如下): 我正在尝试获取“测试部分:”和“我的部分”之后的文本 我用不同的RegEx模式进行了几次尝试,但结果一无所获。 如果我做: 然后,我得到正确的答复: 但是,如果我这样做 我没有结果。结果应为“我的第二 部分 ” 我也尝试过使用RegEx Multiline,但没有结果。 任何帮助,将不胜感激。 如果重要的话,我正在Python 2.7中进行编码。 如果不清楚

  • 问题内容: 我正在尝试使用FlatFileItemReader解析CSV文件。此CSV包含一些带引号的换行符,如下所示。 但是此解析失败,必填字段为2,而实际字段为1。 FlatFileReader配置中缺少什么? 问题答案: 开箱即用的FlatFileItemReader使用SimpleRecordSeparatorPolicy,用于您的用例 注释部分超过2行或更多行 您需要设置DefaultR

  • 问题内容: 进行时: 与此文件: (第一个列是UNIX时间戳,即自1970年1月1日起经过的秒数),当我每15秒对数据进行一次重采样时出现以下错误: 就像“ datetime”信息尚未解析: 如何使用熊猫模块导入带有存储为时间戳的日期的.CSV? 然后,一旦我能够导入CSV, 如何访问日期 > 2015-12-02 12:02:18的行? 问题答案: 我的解决方案类似于Mike的解决方案: