计算化学公社

 找回密码 Forget password
 注册 Register
Views: 629|回复 Reply: 6
打印 Print 上一主题 Last thread 下一主题 Next thread

[Multiwfn使用咨询] 怎样让Multiwfn批处理时按一定顺序进行

[复制链接 Copy URL]

58

帖子

0

威望

351

eV
积分
409

Level 3 能力者

使用Multiwfn在linux下的批处理功能时(http://sobereva.com/612),遇到一个问题:
我的文件都是以文件名+数字后缀的形式命名的,例如pfoa_1, pfoa_2……
但是Multiwfn批处理时,不是按照文件名的顺序执行(如图),这给后续处理带来不便,请问如何解决这个问题。

360截图20230312113438235.png (9.29 KB, 下载次数 Times of downloads: 16)

360截图20230312113438235.png

5万

帖子

99

威望

5万

eV
积分
112351

管理员

公社社长

2#
发表于 Post on 2023-3-12 11:57:33 | 只看该作者 Only view this author
产生文件的时候把十位数用0补齐
北京科音自然科学研究中心http://www.keinsci.com)致力于计算化学的发展和传播,长期开办高质量的各种计算化学类培训:初级量子化学培训班中级量子化学培训班高级量子化学培训班量子化学波函数分析与Multiwfn程序培训班分子动力学与GROMACS培训班CP2K第一性原理计算培训班,内容介绍以及往届资料购买请点击相应链接查看。这些培训是计算化学从零快速入门以及进一步全面系统性提升研究水平的高速路!培训各种常见问题见《北京科音办的培训班FAQ》
欢迎加入“北京科音”微信公众号获取北京科音培训的最新消息、避免错过网上有价值的计算化学文章!
欢迎加入人气非常高、专业性特别强的综合性理论与计算化学交流QQ群“思想家公社QQ群”:1号:18616395,2号:466017436,3号:764390338,搜索群号能搜到哪个说明目前哪个能加,合计9000人。北京科音培训班的学员在群中可申请VIP头衔,提问将得到群主Sobereva的最优先解答。
思想家公社的门口Blog:http://sobereva.com(发布大量原创计算化学相关博文)
Multiwfn主页:http://sobereva.com/multiwfn(十分强大的量子化学波函数分析程序)
ResearchGate:https://www.researchgate.net/profile/Tian_Lu
Money and papers are rubbish, get a real life!

353

帖子

1

威望

1971

eV
积分
2344

Level 5 (御坂)

3#
发表于 Post on 2023-3-12 12:29:55 | 只看该作者 Only view this author
这本来就是按文件名顺序的字典排序法...比如字符'3'在字符'4'前面,39.fch和3.fch比,英文句号'.'的ASCII码是46,数字'3'是51,点在数字前面,所以_3.fch就应该排在_39.fch和_40.fch之间。如果你想按数值大小排序而不是按字符串的字典排序法,要么如卢老师说,用shell的printf之类的命令让前一步固定输出几位数字,不足的用0补全,比如_03.fch,要么循环用ls -v,比如
  1. for filename in `ls -v *.fch`
  2. do
  3.     Multiwfn $filename << EOF
  4. # Multiwfn commands
  5. EOF
  6. done
复制代码

评分 Rate

参与人数
Participants 1
eV +2 收起 理由
Reason
sobereva + 2

查看全部评分 View all ratings

145

帖子

0

威望

3113

eV
积分
3258

Level 5 (御坂)

4#
发表于 Post on 2023-3-12 16:50:02 | 只看该作者 Only view this author
shell(bash)建议后面通过管道加个sort -V或者sort -n
效果跟三楼一样
  1. ls -v
复制代码


  1. ls *.fch | sort -V
复制代码

58

帖子

0

威望

351

eV
积分
409

Level 3 能力者

5#
 楼主 Author| 发表于 Post on 2023-3-12 17:05:56 | 只看该作者 Only view this author
snljty2 发表于 2023-3-12 12:29
这本来就是按文件名顺序的字典排序法...比如字符'3'在字符'4'前面,39.fch和3.fch比,英文句号'.'的ASCII码 ...

好的,谢谢。还是你的第二个方法简捷,赞
本来我按照社长的建议,用0补齐文件名,python脚本如下:
import os
filePath='C:\\Users\\Administrator\\Desktop\\1'
def fileNameAlign(filePath,connector='_'):
    os.chdir(filePath)
    fileList=[i for i in os.listdir() if connector in i]
    print(fileList)
    for i in fileList:
        name,numType=i.split(connector)
        num,typeName=numType.split('.')
        while len(num)<3:
            num='0'+num
            print()
        os.rename(i,name+'_'+num+'.'+typeName)
fileNameAlign(filePath,connector='_')
#使用时需要设置文件的路径,如果是Gaussian批量保存的出来的多个文件,用默认的下划线_作为文件名连接符即可。

353

帖子

1

威望

1971

eV
积分
2344

Level 5 (御坂)

6#
发表于 Post on 2023-3-12 17:37:57 | 只看该作者 Only view this author
本帖最后由 snljty2 于 2023-3-13 09:19 编辑
chuan437 发表于 2023-3-12 17:05
好的,谢谢。还是你的第二个方法简捷,赞
本来我按照社长的建议,用0补齐文件名,python脚本如下:
imp ...

4L的也是一种方式。另外Python里肯定不用这么麻烦。可以找本教材看看Python格式化字符串的部分。就我所知至少有三种比较简单而且常见的写法:
第一种,C语言风格的%格式化字符串,最古老的一种:
  1. for i in range(1, 1 + 99):
  2.     print("pfoa_%02d.fch" % i)
复制代码

第二种,用Python2.6和3.0新加的string类的的format方法:
  1. for i in range(1, 1 + 99):
  2.     print("pfoa_{:02d}.fch".format(i))
复制代码

第三种:用Python 3.6开始引入的f-string
  1. for i in range(1, 1 + 99):
  2.      print(f"pfoa_{i:02d}.fch")
复制代码

可能还有一些使用string.Template之类的方法,不深究了。
顺便说一下上面Shell的写法
  1. for i in `seq 1 99`
  2. do
  3.     printf "pfoa_%02d.fch\n" $i
  4. done
复制代码

58

帖子

0

威望

351

eV
积分
409

Level 3 能力者

7#
 楼主 Author| 发表于 Post on 2023-3-12 18:24:31 | 只看该作者 Only view this author
snljty2 发表于 2023-3-12 17:37
4L的也是一种方式。另外Python里肯定不用这么麻烦。可以找本教材看看Python格式化字符串的部分。就我所知 ...

赞,你的代码确实很pythonic!

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-23 10:50 , Processed in 0.399460 second(s), 25 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list