Python 重命名多个编号的文件

Python 重命名多个编号的文件,python,file,pandas,Python,File,Pandas,我从一个数据记录器中获取了一系列数据,并按顺序保存: data_0, data_1, ... , data_10, data_11,.., data_100, data_101 data_0, data_1, data_100, data_101,..., data_109, data_11, data_110, 等等 data_0, data_1, data_100, data_101,..., data_109, data_11, data_110, 我在pandas中逐个导入文件并进

我从一个数据记录器中获取了一系列数据,并按顺序保存:

data_0, data_1, ... , data_10, data_11,.., data_100, data_101
data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
等等

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
我在pandas中逐个导入文件并进行处理,后来意识到pandas导入的文件序列是:

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
这把我的计算搞得一团糟

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
我使用的代码是

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
path = 'C:/Users/XXX/Documents/test1/XYZ'
allFiles = glob.glob(path + "/*.dat")
for file_ in allFiles:
    data = pd.read_table(file_,index_col=None, header=0)

我开始将文件重命名为data_xxx.dat格式或任何其他导入文件的方法。

问题是,返回的文件名已排序,对于字符串,它使用字典排序,而对于字符串,则使用常规排序

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
In [23]: x = ['data_0', 'data_1', 'data_100', 'data_101', 'data_109', 'data_11', 'data_110']

In [24]: sorted(x)
Out[24]: ['data_0', 'data_1', 'data_100', 'data_101', 'data_109', 'data_11', 'data_110']
看,它被分类了。一个快速修复方法是使用一个键函数对文件名列表进行排序,强制它按int排序。 大概是这样的:

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
In [25]: sorted(x, key=lambda s: int(s.partition('_')[-1]))
Out[25]: ['data_0', 'data_1', 'data_11', 'data_100', 'data_101', 'data_109', 'data_110']
实际上,您应该在保存文件名时使用.zfill,这将使词典排序按您所希望的方式进行:

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
In [28]: x = ["".join([a,b,c.zfill(5)]) for a,b,c in (s.partition('_') for s in x)]

In [29]: x
Out[29]:
['data_00000',
 'data_00001',
 'data_00100',
 'data_00101',
 'data_00109',
 'data_00011',
 'data_00110']

In [30]: sorted(x)
Out[30]:
['data_00000',
 'data_00001',
 'data_00011',
 'data_00100',
 'data_00101',
 'data_00109',
 'data_00110']

In [31]:
如果您可以为您希望拥有的文件数量提供某种上限,那么使用zfill是最好的方法

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
以防zfill正在做的事情不明显

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
In [31]: "3".zfill(3)
Out[31]: '003'

In [32]: "3".zfill(2)
Out[32]: '03'

In [33]: "3".zfill(1)
Out[33]: '3'

In [34]: "3".zfill(10)
Out[34]: '0000000003'

问题是返回的文件名是经过排序的,这对于字符串使用字典排序,而对于字符串则使用常规排序

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
In [23]: x = ['data_0', 'data_1', 'data_100', 'data_101', 'data_109', 'data_11', 'data_110']

In [24]: sorted(x)
Out[24]: ['data_0', 'data_1', 'data_100', 'data_101', 'data_109', 'data_11', 'data_110']
看,它被分类了。一个快速修复方法是使用一个键函数对文件名列表进行排序,强制它按int排序。 大概是这样的:

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
In [25]: sorted(x, key=lambda s: int(s.partition('_')[-1]))
Out[25]: ['data_0', 'data_1', 'data_11', 'data_100', 'data_101', 'data_109', 'data_110']
实际上,您应该在保存文件名时使用.zfill,这将使词典排序按您所希望的方式进行:

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
In [28]: x = ["".join([a,b,c.zfill(5)]) for a,b,c in (s.partition('_') for s in x)]

In [29]: x
Out[29]:
['data_00000',
 'data_00001',
 'data_00100',
 'data_00101',
 'data_00109',
 'data_00011',
 'data_00110']

In [30]: sorted(x)
Out[30]:
['data_00000',
 'data_00001',
 'data_00011',
 'data_00100',
 'data_00101',
 'data_00109',
 'data_00110']

In [31]:
如果您可以为您希望拥有的文件数量提供某种上限,那么使用zfill是最好的方法

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
以防zfill正在做的事情不明显

data_0, data_1, data_100, data_101,..., data_109, data_11, data_110,
In [31]: "3".zfill(3)
Out[31]: '003'

In [32]: "3".zfill(2)
Out[32]: '03'

In [33]: "3".zfill(1)
Out[33]: '3'

In [34]: "3".zfill(10)
Out[34]: '0000000003'

漂亮!!:-1我无法控制数据记录器中保存的文件命名标准。2我的文件最后的扩展名是.dat,所以当使用sortedx时,结果得到了预期int的错误,并收到了0.dat,key=lambda s:ints.partition''.[-1]@ParthSingh好的,看来你有必要的工具来处理这个问题,不是吗?不是,它没有解决这个问题。很抱歉我尝试对字符串列表进行排序并传递它,for num的范围为0399:file\uu=glob.globpath+data\uu+strnum+.dat portfolio=pd.read\u tablefile\uu,index\u col=None,header=0,但得到了以下错误IOError:Expected file path name或file-like-object,得到了typeNo,我的意思是,您可以轻松地扩展上述内容,以适应文件以.dat结尾的情况…非常漂亮!!:-1我无法控制数据记录器中保存的文件命名标准。2我的文件最后的扩展名是.dat,所以当使用sortedx时,结果得到了预期int的错误,并收到了0.dat,key=lambda s:ints.partition''.[-1]@ParthSingh好的,看来你有必要的工具来处理这个问题,不是吗?不是,它没有解决这个问题。很抱歉我尝试对字符串列表进行排序并传递它,for num的范围为0399:file\uu=glob.globpath+data\uu+strnum+.dat portfolio=pd.read\u tablefile\uu,index\u col=None,header=0,但得到了以下错误IOError:Expected file path name或file-like-object,得到了typeNo,我的意思是,您可以轻松地扩展上述内容,以适应文件以.dat结尾的情况。。。