<p><code>"U://Working_Files".format(x)</code>导致<code>"U://Working_Files"</code>,因为字符串中没有占位符(<code>{}</code>)。您应该使用<a href="https://docs.python.org/3/library/os.path.html#os.path.join" rel="nofollow noreferrer">^{<cd4>}</a>来处理路径构建。另外,您不应该将<code>/</code>正斜杠加倍(您可能会将这与在Python字符串文本中生成单个反斜杠所需的<code>\\</code>混淆):</p>
<pre><code>import os.path
source = "U:/Working_Files"
nameList = [os.path.join(source, name) for name in ['Property', 'Ownership', 'Sold', 'Lease']]
</code></pre>
<p>这实际上是您所犯的唯一逻辑错误;其余代码确实按设计工作。也就是说,有一些事情可以改进。在</p>
<p>就个人而言,我将把源目录名和子目录名放在一起的工作留给函数循环。这为您在设置配置时节省了一个额外的循环。在</p>
^{pr2}$
<p>我不会在目录前面加上<code>~</code>;把这个留给配置<code>source</code>目录的人;他们可以显式地指定<code>~/some_directory</code>或{<cd10>}作为路径。函数应该接受<em>参数</em>,而不是使用全局变量。此外,在目录前面加上<code>~</code>将不允许在这样一个路径的开头使用<code>~some_other_account_name</code>。在</p>
<p>我早就跳过那些不是文件的内容;不需要获取目录的修改日期,对吗?在</p>
<p>以下操作将把任何非目录名移出目录,放入名为<code>superseded</code>的子目录中:</p>
<pre><code>import os
import os.path
import datetime
def rename_and_move_files(source, subdirs, destination_subdir):
"""Archive files from all subdirs of source to destination_subdir
subdirs is taken as a list of directory names in the source path, and
destination_subdir is the name of a directory one level deeper. All files
in the subdirectories are moved to the destination_subdir nested directory,
renamed with their last modification date as a YYYYMMDD_ prefix.
For example, rename_and_move_files('C:\', ['foo', 'bar'], 'backup') moves
all files in the C:\foo to C:\foo\backup, and all files in C:\bar to
C:\bar\backup, with each file prefixed with the last modification date.
A file named spam_ham.ext, last modified on 2018-01-10 is moved to
backup\20180110_spam_ham.ext.
source is made absolute, with ~ expansion applied.
Returns a dictionary mapping old filenames to their new locations, using
absolute paths.
"""
# support relative paths and paths starting with ~
source = os.path.abspath(os.path.expanduser(source))
renamed = {}
for name in subdirs:
subdir = os.path.join(source, name)
destination_dir = os.path.join(subdir, destination_subdir)
for filename in os.listdir(destination_dir):
path = os.path.join(subdir, filename)
if not os.path.isfile(path):
# not a file, skip to the next iteration
continue
modified_timestamp = os.path.getmtime(path)
modified_date = datetime.date.fromtimestamp(modified_timestamp)
new_name = '{:%Y%m%d}_{}'.format(modified_date, filename)
destination = os.path.join(destination_dir, new_name)
os.rename(path, destination)
renamed[path] = destination
return renamed
source = "U:/Working_Files"
name_list = ['Property', 'Ownership', 'Sold', 'Lease']
renamed = rename_and_move_files(source, name_list, 'superseded')
for old, new in sorted(renamed.items()):
print '{} -> {}'.format(old, new)
</code></pre>
<p>上述措施也尽量减少工作量。您只需要解析<code>source</code>路径一次,而不是针对<code>subdirs</code>中的每个名称。<code>datetime</code>对象直接支持<code>str.format()</code>格式,因此我们可以从修改后的时间戳和旧名称一步形成新的文件名。<code>os.path.abspath()</code>还清除了<code>//</code>双斜杠之类的错误,使其更加健壮。在</p>
<p>该函数不打印循环中的每个路径,而是返回已重命名文件的映射,因此调用者可以根据需要进一步处理该映射。在</p>