2016-04-13 58 views
0

我有一些大型的csv和xlsx文件,我需要为其设置pandas DataFrames。我有在目录中定位这些文件的代码(打印时,这些代码显示正确的路径名)。然后这些路径被传递给一个帮助函数,这个函数意味着为这些文件设置所需的数据帧,然后数据将被传递给其他函数进行一些操作。我打算在完成后将数据写入文件(通过加载模板,将数据写入文件并保存此文件)。大熊猫为CSV返回空的DataFrames

目前,我有这样的代码:

import pandas 
# some set-up functions (which work; verified using print statements) 

def createDataFrame(filename): 
    if filename.endswith('.csv'): 
     df = pandas.read_csv(StringIO(filename), skip_blank_lines=True, index_col=False, 
          encoding="utf-8", skipinitialspace=True) 

当我尝试print(df),我得到:

Empty DataFrame

Columns: [a.csv]

Index: []

print(StringIO(filename))给我:

<_io.StringIO object at 0x004D1990>

然而,当我离开了StringIO()filename左右的函数中,我得到这个错误:

OSError: File b'a.csv' does not exist

无处不在,我已经能够找到已任刚说import and start using,或有关使用read_csv()而不是from_csv()from this question,这是不是非常有帮助这里)谈判,甚至the current pandas docs此信息基本上说它应该像传递文件到pandas.read_csv()一样简单。

1)我检查了我有完整的权限,并且该文件是有效的并且存在。为什么我得到OSError?

2)当我使用StringIO()时,为什么我仍然在这里得到一个空的DataFrame?我怎样才能解决这个问题?

在此先感谢。

+0

为什么你需要'StringIO'?如果没有这个,它会不会起作用?即'pandas.read_csv(文件名,...)' – EdChum

+0

,张贴在我的问题,没有StringIO的我正在一个OSERROR。我一直无法发现为什么,并希望能解决这个问题的任何指针(然后也许它会工作) – DJGrandpaJ

回答

0

我已经解决了这个问题。

StringIO是此问题的根源。因为我是在Windows上,os.path.is_file()返航假的,我得到了错误:

OSError: File b'a.csv' does not exist

直到我偶然发现了this page from the Python 2.5 docs,我发现呼叫实际上应该是os.path.isfile()在Windows,因为它使用ntpath幕后。这是为了更好地处理系统之间路径名的差异(Windows使用'\',Unix使用'/')。

由于我的路径有些奇怪,熊猫无法正确加载CSV文件到DataFrame中。

通过简单地从这个改变我的代码:

import pandas 
# some set-up functions (which work; verified using print statements) 

def createDataFrame(filename): 
    if filename.endswith('.csv'): 
     df = pandas.read_csv(StringIO(filename), skip_blank_lines=True, index_col=False, 
          encoding="utf-8", skipinitialspace=True) 

这样:

import pandas 
# some set-up functions (which have been updated) 

def createDataFrame(filename): 
    basepath = config.complete_datasets_dir 
    fullpath = os.path.join(basepath, filename) 

    if filename.endswith('.csv'): 
     df = pandas.read_csv(fullpath, skip_blank_lines=True, index_col=False, 
          encoding="utf-8", skipinitialspace=True) 

,并适当地更新它调用该函数的功能:

def somefunc(): 
    dfs = [] 
    data_lists = getInputFiles() # checks data directory for files containing info 
    for item in data_lists: 
     tdata = createDataFrames(item) 
     dfs.append(tdata) 
    print(dfs) 

我能让我一直在寻找的输出:

[ 1 2 3 4 5 6 7 8 9 10 
0 11 12 13 14 15 16 17 18 19 20 
1 21 22 23 24 25 26 27 28 29 30 
2 31 32 33 34 35 36 37 38 39 40,  1 2 3 4 5 6 7 8 9 10 
0 11 12 13 14 15 16 17 18 19 20 
1 21 22 23 24 25 26 27 28 29 30] 

这是两个DataFrames的列表,其中第一个由仅含有数1-40(4行共计,无标题)一个CSV来到;第二个文件只包含数字1-30(格式相同)。

我希望这可以帮助别人的未来。