Python 跳过未知行数以读取标题
我有一个excel数据,我用python熊猫读入:Python 跳过未知行数以读取标题,python,pandas,Python,Pandas,我有一个excel数据,我用python熊猫读入: import pandas as pd data = pd.read_csv('..../file.txt', sep='\t' ) 模拟数据如下所示: unwantedjunkline1 unwantedjunkline2 unwantedjunkline3 ID ColumnA ColumnB ColumnC 1 A B C 2 A
import pandas as pd
data = pd.read_csv('..../file.txt', sep='\t' )
模拟数据如下所示:
unwantedjunkline1
unwantedjunkline2
unwantedjunkline3
ID ColumnA ColumnB ColumnC
1 A B C
2 A B C
3 A B C
...
本例中的数据在命中标题之前包含3个垃圾行(我不想读入的行),有时包含4个或更多垃圾行。因此,在本例中,我读入了数据:
data = pd.read_csv('..../file.txt', sep='\t', skiprows = 3 )
数据如下所示:
ID ColumnA ColumnB ColumnC
1 A B C
2 A B C
3 A B C
...
但是每次不需要的行数不同时,是否有一种方法可以使用pandas读取表文件,而不使用“skiprows=”,而是使用一些与标题匹配的命令,以便它知道从标题开始读取?因此,我不必单击“打开文件”来计算文件每次包含多少不需要的行,然后手动更改“skiprows=”选项。如果您知道标题的开头:
def skip_to(fle, line,**kwargs):
if os.stat(fle).st_size == 0:
raise ValueError("File is empty")
with open(fle) as f:
pos = 0
cur_line = f.readline()
while not cur_line.startswith(line):
pos = f.tell()
cur_line = f.readline()
f.seek(pos)
return pd.read_csv(f, **kwargs)
演示:
通过调用.tell
我们可以跟踪上一行的指针位置,因此当我们点击标题时,我们会返回到该行并将文件对象传递给pandas
或者使用垃圾,如果他们都是从共同点开始的:
def skip_to(fle, junk,**kwargs):
if os.stat(fle).st_size == 0:
raise ValueError("File is empty")
with open(fle) as f:
pos = 0
cur_line = f.readline()
while cur_line.startswith(junk):
pos = f.tell()
cur_line = f.readline()
f.seek(pos)
return pd.read_csv(f, **kwargs)
df = skip_to("test.txt", "junk",sep="\t")
你自己跳过这些行,然后传递一个文件object@Padraic坎宁安对不起?我不遵循使用
open
创建文件对象,在文件对象中迭代,直到到达垃圾的末尾(您必须了解如何评估),然后将文件对象传递到pd.read\u csv(fileobject,…)
而不是文件路径。@Jessica,我添加了一个答案,一旦你知道了头,你就把它传递给函数,带有readline和tell的逻辑才是最重要的,你可以用它做任何你想做的事情,比如获取更多的参数或者仅仅使用逻辑,它只是一个example@Jessica,因为您需要通过sep=“\t”
,我添加了一个选项来传递将被传递到read_csv的关键字,我的编辑也遗漏了一个而不是;0如何将此函数更改为输出excel文件而不是.csv?我试过了,但我一直得到的错误是:UnicodeDecodeError:“charmap”编解码器在应用于读取excel文件时,无法将位置17:字符映射到的字节0x8d解码。@Jessica,在打开的calli中设置encoding=“utf8”
尝试了“encoding='latin-1'没有错误消息,但也没有输出,脚本似乎永远在运行@帕德雷克Cunningham@Jessica,您需要指定正确的编码,否则可能会导致垃圾,您知道数据编码到的实际编码吗?此外,就永远运行而言,如果文件非常大,解析可能需要相当长的时间,while循环不可能永远结束,因为它在匹配或EOF上停止。
def skip_to(fle, junk,**kwargs):
if os.stat(fle).st_size == 0:
raise ValueError("File is empty")
with open(fle) as f:
pos = 0
cur_line = f.readline()
while cur_line.startswith(junk):
pos = f.tell()
cur_line = f.readline()
f.seek(pos)
return pd.read_csv(f, **kwargs)
df = skip_to("test.txt", "junk",sep="\t")