- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
使用 Python,我尝试根据每个给定文本文件中的特定短语重命名目录中的一系列 .txt 文件。换句话说,更具体地说,我有几百个具有任意名称的文本文件,但每个文件中都有一个独特的短语(类似于 No. 85-2156)。我想用每个文本文件的给定短语替换任意文件名。该短语并不总是在同一行上(尽管它不会偏离那么多)但它始终采用相同的格式并带有编号前缀。
我看过 os module我明白了
可能很有用,但我不明白如何将这些函数与内部文本操作函数(如 linecache)结合起来或一般的线路阅读功能。
我想过很多方法来完成这个任务,但看起来最简单和最有效的方法是创建一个循环来查找文件中的唯一短语,将其分配给一个变量并使用该变量重命名移动到下一个文件之前的文件。
这看起来应该很简单,以至于我觉得写这个问题很傻。在过去的几个小时里,我一直在阅读文档并通过 StackOverflow 进行解析,但似乎之前没有人遇到过这个问题——或者至少他们没有询问过他们的问题。
谁能指出我正确的方向?
编辑 1:当我使用 this website 创建正则表达式模式时,它创建了庞大但看似可行的代码:
import re
txt='No. 09-1159'
re1='(No)' # Word 1
re2='(\\.)' # Any Single Character 1
re3='( )' # White Space 1
re4='(\\d)' # Any Single Digit 1
re5='(\\d)' # Any Single Digit 2
re6='(-)' # Any Single Character 2
re7='(\\d)' # Any Single Digit 3
re8='(\\d)' # Any Single Digit 4
re9='(\\d)' # Any Single Digit 5
re10='(\\d)' # Any Single Digit 6
rg = re.compile(re1+re2+re3+re4+re5+re6+re7+re8+re9+re10,re.IGNORECASE|re.DOTALL)
m = rg.search(txt)
name = m.group(0)
print name
当我操纵它以适应 glob.glob
结构,并使其像这样时:
import glob
import os
import re
re1='(No)' # Word 1
re2='(\\.)' # Any Single Character 1
re3='( )' # White Space 1
re4='(\\d)' # Any Single Digit 1
re5='(\\d)' # Any Single Digit 2
re6='(-)' # Any Single Character 2
re7='(\\d)' # Any Single Digit 3
re8='(\\d)' # Any Single Digit 4
re9='(\\d)' # Any Single Digit 5
re10='(\\d)' # Any Single Digit 6
rg = re.compile(re1+re2+re3+re4+re5+re6+re7+re8+re9+re10,re.IGNORECASE|re.DOTALL)
for fname in glob.glob("\file\structure\here\*.txt"):
with open(fname) as f:
contents = f.read()
tname = rg.search(contents)
print tname
然后这会打印出模式的字节位置——表示正则表达式模式是正确的。但是,当我在原始 tname = rg.search(contents)
之后添加 nname = tname.group(0)
行并更改 print 函数以反射(reflect)改变,它给了我以下错误:AttributeError:“NoneType”对象没有属性“组”。当我尝试逐行复制和粘贴@joaquin 的代码时,出现了同样的错误。我打算将此作为对 @spatz 答案的评论发布,但我想包含如此多的代码,以至于这似乎是表达"new"问题的更好方式。感谢大家迄今为止的帮助。
编辑 2:这是针对下面@joaquin 的回答:
import glob
import os
import re
for fname in glob.glob("/directory/structure/here/*.txt"):
with open(fname) as f:
contents = f.read()
tname = re.search('No\. (\d\d\-\d\d\d\d)', contents)
nname = tname.group(1)
print nname
最后编辑:我主要使用编写的代码让它工作。发生的事情是有些文件没有那个正则表达式,所以我假设 Python 会跳过它们。傻我。于是我花了三天时间学会了写两行代码(我知道教训不止这些)。我也使用了这里推荐的错误捕获方法。我希望我能检查你们所有人的答案,但我最困扰@Joaquin,所以我把它给了他。这是一次很棒的学习经历。谢谢大家如此慷慨地抽出时间。最终代码如下。
import os
import re
pat3 = "No\. (\d\d-\d\d)"
ext = '.txt'
mydir = '/directory/files/here'
for arch in os.listdir(mydir):
archpath = os.path.join(mydir, arch)
with open(archpath) as f:
txt = f.read()
s = re.search(pat3, txt)
if s is None:
continue
name = s.group(1)
newpath = os.path.join(mydir, name)
if not os.path.exists(newpath):
os.rename(archpath, newpath + ext)
else:
print '{} already exists, passing'.format(newpath)
最佳答案
我不想向您提供一些您将在不理解的情况下简单地复制粘贴的代码,而是想引导您完成解决方案,以便您能够自己编写,更重要的是获得足够的知识以能够下次单独做。
执行您需要的代码由三个主要部分组成:
这最好通过 glob 实现模块。这个模块允许你指定类似 shell 的通配符,它会扩展它们。这意味着为了获得给定目录中的 .txt
文件列表,您需要调用函数 glob.iglob("/path/to/directory/*.txt ")
并迭代其结果(for filename in ...:
)。
一旦我们有了文件名,我们需要open()
它,使用read()
读取它的内容并将它存储在一个变量中,我们可以在其中搜索什么我们需要。这看起来像这样:
with open(filename) as f:
contents = f.read()
现在我们有了内容,我们需要寻找唯一的短语。这可以使用 regular expressions 来完成.将您想要的新文件名存储在变量中,比如 newfilename
。
现在我们有了旧文件名和新文件名,我们需要简单地重命名文件,这是使用 os.rename(filename, newfilename)
完成的。
如果要将文件移动到不同的目录,请使用 os.rename(filename, os.path.join("/path/to/new/dir", newfilename)
。注意我们需要 os.path.join
来使用目录路径和 newfilename
为文件构造新路径。
关于python - 根据文件内容重命名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8903060/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!