我有一些大的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?我该如何解决这个问题?
提前致谢。
答案 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(格式相同)。
我希望将来可以帮助某人。