如何使用python删除目录中的n个文件

时间:2019-02-19 09:53:29

标签: python

我有猫和狗的图像数据集。我将其转换为两个文件夹(猫和狗),每个文件夹包含大约10000张图像。到目前为止,我不需要10000张图像,每个文件夹中只需要2000张图像。如何在python中自动化。

我知道要删除文件X,我可以使用os.remove(X) 类似于删除文件夹os.rmdir(dir_)

但是我想知道如何有效地随机删除每个文件夹中的n个文件

到目前为止,我尝试过

dogs_dir=os.listdir('dogs')
cats_dir=os.listdir('cats')

selected_dogs = np.random.choice(dogs_dir,8000)
selected_cats = np.random.choice(cats_dir,8000)

for file_ in selected_dogs:
    os.remove('dogs/'+file_)

for file_ in selected_cats:
    os.remove('cats/'+file_)    

上面的代码为我完成了工作,但我想知道它们的有效方法是什么,这样我就可以消除代码中的复杂性。

任何帮助都是有意义的。

我正在使用ubuntu 17.10,现在,基于linux的解决方案就足够了,但是如果它与Windows兼容,那么它会更有价值。

2 个答案:

答案 0 :(得分:2)

您的代码对我来说似乎还可以。

我会做一些调整:

  1. 最好使用import React, { Component } from 'react'; import { getUsers } from './store/actions' import { connect } from 'react-redux' import { Switch, Route, withRouter } from "react-router-dom"; import Home from './components/Home' import Blog from './components/blog/Blog' import Users from './components/users/Users' import Nav from './components/navigation/Nav'; import axios from 'axios'; const userApi = "https://jsonplaceholder.typicode.com/users" class App extends Component { componentWillMount() { axios.get(userApi) .then(response => { let users = response.data this.props.getUserList(users) }) .catch(error => { console.log(error) }) } render() { return ( <div className="container"> <Nav /> <Switch> <Route path="/blog" component={Blog} /> <Route path="/users/" component={Users} /> <Route path="/" component={Home} axact /> </Switch> </div> ); } } const mapDispatchToProps = dispatch => ({ getUserList: (api) => dispatch(getUsers(api)) }) export default withRouter(connect(null, mapDispatchToProps)(App)); 库,因此它应该是跨平台的。这是因为,当您编写os时,os.remove('dogs/'+file_)并不是跨平台的。使用/会更好。

  2. 您正在浪费大量空间来保存要删除的文件名列表(两个10000个字符串的列表)。如果对您而言无关紧要,可以通过切片来节省一些空间(20%):

    os.remove(os.path.join('dogs', file_))

    如果保留哪些图像确实很重要,最好生成索引(较少的空间):

    dogs_delete=os.listdir('dogs')[2000:]  # Take the last 8000 images
    for file_ in dogs_delete:
        os.remove(os.path.join('dogs', file_))
    

答案 1 :(得分:2)

我将使用random.sample()pathlib模块来代替numpyos

from pathlib import Path
import random

def delete_images(directory, number_of_images, extension='jpg'):
    images = Path(directory).glob(f'*.{extension}')
    for image in random.sample(images, number_of_images):
        image.unlink()

delete_images('dogs', 8000)
delete_images('cats', 8000)    

Path('cats/').glob('*.jpg')返回一个Path对象的列表,这些对象表示cats目录中文件名以.jpg结尾的文件。

random.sample(<something>, 8000)从列表中随机抽取8000个项目。

Path().unlink()删除文件。