我已经使用熊猫
读取和解析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
我从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:00
、00: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
这是大型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的解决方案: