大熊猫为CSV返回空的DataFrames
我有一些大型的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?我怎样才能解决这个问题?
在此先感谢。
我已经解决了这个问题。
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(格式相同)。
我希望这可以帮助别人的未来。
为什么你需要'StringIO'?如果没有这个,它会不会起作用?即'pandas.read_csv(文件名,...)' – EdChum
,张贴在我的问题,没有StringIO的我正在一个OSERROR。我一直无法发现为什么,并希望能解决这个问题的任何指针(然后也许它会工作) – DJGrandpaJ