使用 python 中的 csv 文件从目录中删除文件
Deleting files from a directory using a csv file in python
我想使用 .csv 文件从多个文件夹中删除文件。 csv 文件包含需要删除的文件名列表(例如:Box4、60012-01)。数据的存储方式是在多个文件夹中,并且还有其他扩展名(例如:/tiles_20X_299/Box20/660491-3_mag20_xpos5980_ypos6279.jpg。有没有办法删除这些文件。非常感谢帮助。
这是我到目前为止所拥有的,但不确定我是否朝着正确的方向前进。
[要删除的 csv 文件示例][1]
fin = open('files_to_delete.csv', 'r')
fin.readline()
print(fin)
file_to_delete = set()
while True:
line = fin.readline().strip()
#print(line)
if not line:
break
array = line.split(',')
file_to_delete.add("Box" + array[0] + "/" + array[1])
fin.close()
print(file_to_delete)
#
for path in glob.glob('/home/sshah/Tiles/tiles_20X_299/*'):
for f in file_to_delete:
print(f)
os.chdir(path)
#print(path)
if os.path.exists(f):
print('delete')
#os.remove(f)```
[1]: https://i.stack.imgur.com/dFCxk.png
你的方向绝对正确。
假设您 运行 至少是 Python 的 3.5 版,您可以使用 glob.iglob()
递归遍历每个子目录中的每个文件。
我调整了您的代码,使其更符合 Python 风格。
一些具体的变化:
将 file_to_delete
set
重命名为 files_to_delete
因为它包含多个文件并且应该是复数。
对文件对象的上下文管理器使用了with
语句以避免担心异常并显式调用 .close()
.
循环 fin
获取每一行而不显式调用 .readline()
.
使用 os.path.sep
而不是硬编码 /
。
删除了不必要的 os.chdir(path)
和 os.path.exists(f)
调用。
它的工作原理是遍历每个子目录中的每个文件(这为我们提供了 str
的完整文件路径),然后我们遍历 files_to_delete
set
以检查是否每个file_to_delete
是 filepath
的子串。如果是,则删除该文件,然后 break
退出该循环以继续下一个文件路径。
如果您知道没有其他具有相似基数的文件名,您可以取消注释此行:files_to_delete.remove(file_to_delete)
。例如,如果您有一个名为:
的文件
/tiles_20X_299/Box20/660491-3_mag20_xpos5980_ypos6279.jpg
但不是另一个叫:
/tiles_20X_299/Box20/660491-3_mag10_xpos2000_ypos4000.jpg
为了安全起见,请将其注释掉。
import glob, os
files_to_delete = set()
with open('files_to_delete.csv', 'r') as fin:
fin.readline() # Consume header
for line in fin:
line = line.strip()
if line:
files_to_delete.add('Box' + line.replace(',', os.path.sep)) # Assume none of the files contain a comma
print(files_to_delete)
for filepath in glob.iglob(r'/home/sshah/Tiles/tiles_20X_299/**/*', recursive=True):
for file_to_delete in files_to_delete:
if file_to_delete in filepath:
print('Delete:', filepath)
#os.remove(filepath)
#files_to_delete.remove(file_to_delete)
break
我想使用 .csv 文件从多个文件夹中删除文件。 csv 文件包含需要删除的文件名列表(例如:Box4、60012-01)。数据的存储方式是在多个文件夹中,并且还有其他扩展名(例如:/tiles_20X_299/Box20/660491-3_mag20_xpos5980_ypos6279.jpg。有没有办法删除这些文件。非常感谢帮助。 这是我到目前为止所拥有的,但不确定我是否朝着正确的方向前进。 [要删除的 csv 文件示例][1]
fin = open('files_to_delete.csv', 'r')
fin.readline()
print(fin)
file_to_delete = set()
while True:
line = fin.readline().strip()
#print(line)
if not line:
break
array = line.split(',')
file_to_delete.add("Box" + array[0] + "/" + array[1])
fin.close()
print(file_to_delete)
#
for path in glob.glob('/home/sshah/Tiles/tiles_20X_299/*'):
for f in file_to_delete:
print(f)
os.chdir(path)
#print(path)
if os.path.exists(f):
print('delete')
#os.remove(f)```
[1]: https://i.stack.imgur.com/dFCxk.png
你的方向绝对正确。
假设您 运行 至少是 Python 的 3.5 版,您可以使用 glob.iglob()
递归遍历每个子目录中的每个文件。
我调整了您的代码,使其更符合 Python 风格。
一些具体的变化:
将
file_to_delete
set
重命名为files_to_delete
因为它包含多个文件并且应该是复数。对文件对象的上下文管理器使用了
with
语句以避免担心异常并显式调用.close()
.循环
fin
获取每一行而不显式调用.readline()
.使用
os.path.sep
而不是硬编码/
。删除了不必要的
os.chdir(path)
和os.path.exists(f)
调用。
它的工作原理是遍历每个子目录中的每个文件(这为我们提供了 str
的完整文件路径),然后我们遍历 files_to_delete
set
以检查是否每个file_to_delete
是 filepath
的子串。如果是,则删除该文件,然后 break
退出该循环以继续下一个文件路径。
如果您知道没有其他具有相似基数的文件名,您可以取消注释此行:files_to_delete.remove(file_to_delete)
。例如,如果您有一个名为:
/tiles_20X_299/Box20/660491-3_mag20_xpos5980_ypos6279.jpg
但不是另一个叫:
/tiles_20X_299/Box20/660491-3_mag10_xpos2000_ypos4000.jpg
为了安全起见,请将其注释掉。
import glob, os
files_to_delete = set()
with open('files_to_delete.csv', 'r') as fin:
fin.readline() # Consume header
for line in fin:
line = line.strip()
if line:
files_to_delete.add('Box' + line.replace(',', os.path.sep)) # Assume none of the files contain a comma
print(files_to_delete)
for filepath in glob.iglob(r'/home/sshah/Tiles/tiles_20X_299/**/*', recursive=True):
for file_to_delete in files_to_delete:
if file_to_delete in filepath:
print('Delete:', filepath)
#os.remove(filepath)
#files_to_delete.remove(file_to_delete)
break