我有猫和狗的图像数据集。我将其转换为两个文件夹(猫和狗),每个文件夹包含大约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兼容,那么它会更有价值。
答案 0 :(得分:2)
您的代码对我来说似乎还可以。
我会做一些调整:
最好使用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_)
并不是跨平台的。使用/
会更好。
您正在浪费大量空间来保存要删除的文件名列表(两个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
模块来代替numpy
和os
。
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()
删除文件。