pandas返回CSV的空DataFrames

时间:2016-04-13 16:58:11

标签: csv python-3.x pandas dataframe

我有一些大的csv和xlsx文件,我需要设置pandas DataFrames。我有代码在目录中定位这些文件(打印时,这些文件显示正确的路径名)。然后将这些路径传递给辅助函数,该函数用于为文件设置所需的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)

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

  

清空DataFrame

     

专栏:[a.csv]

     

索引:[]

print(StringIO(filename))给了我:

  

< _io.StringIO对象位于0x004D1990>

但是,当我在函数中忽略StringIO() filename时,我收到此错误:

  

OSError:文件b'a.csv'不存在

我能够找到有关此信息的任何地方或者只是说import and start using,或者谈论使用read_csv()而不是from_csv()from this question,这不是这里非常有帮助,甚至the current pandas docs基本上说它应该像将文件传递给pandas.read_csv()一样简单。

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

2)当我使用StringIO()时,为什么我仍然在这里获得一个空的DataFrame?我该如何解决这个问题?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。

StringIO是此问题的根本原因。因为我在Windows上,os.path.is_file()返回False,我收到错误:

  

OSError:文件b' a.csv'不存在

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

因为我的路径中有一些奇怪的东西,所以pandas无法将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]

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

我希望将来可以帮助某人。