每次都用到,每次都得查,很烦。这里记录常用的python对文件的操作和linux各种命令,以及pytorch报错与解决,持续更新。
文章目录
- python对文件和字符串操作
- 遍历文件夹及子文件中所有文件,进行操作
- 分割字符串
- 读取txt文件中内容
- 读取csv文件中内容
- 对字符串进行排序
- linux常用命令
- 命令行快捷键
- 查看当前目录下每个子目录的文件数量
- 移动多个文件到一个文件夹
- 统计特定开头文件夹/ 文件的个数
- 查看文件夹下一级文件夹内存
- 追加内容到文件末尾
- 按用户CPU占用排行
- 按用户内存占用大小排行
- 修改文件夹权限
- 查看用户,管理员;新增用户
- 修改文件夹所属拥有者和用户名
- 压缩与解压
- 不同服务器传输时排除特定的文件夹
- 查找某个被占用端口的进程
- 查看端口占用情况
- 防火墙相关
- 查看cpu型号
- linux支持中文,显示不乱码
- 传输时排除某些文件夹
- Linux和Windows下获取文件的Md5
- 查看磁盘及挂载状态
- df 文件夹强制以GB为单位进行显示
- 显示文件中指定行
- kill掉所有python进程
- linux 常见错误与解决
- cannot find libtinfow library
- ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.22‘ not found
- (GPU)nvidia-smi不显示pid
- linux系统显示中文乱码
- linux中python文件编码错误: 报错 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 52: invalid continuation byte
- Linux下载时没有证书 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)
- python和conda虚拟环境
- python修改sys.path的三种方法
- pip 换镜像源
- 包的优先搜索路径
- pip install xxx时报错:bad interpreter: python3.8:No such file or directory
- 将conda加到环境变量中
- github常见错误与解决
- git push时 [rejected] dev -> dev (non-fast-forward)
python对文件和字符串操作
遍历文件夹及子文件中所有文件,进行操作
import os
def get_filelist(dir, Filelist):
"""
遍历文件夹及其子文件夹中的文件,并存储在一个列表中
Args:
dir: 输入文件夹路径
Filelist: 空文件列表[]
Returns:
文件列表Filelist,包含文件名(完整路径)
"""
newDir = dir
if os.path.isfile(dir):
# if dir.endswith('.txt'):
# os.remove(dir)
Filelist.append(dir)
elif os.path.isdir(dir):
for s in os.listdir(dir):
newDir = os.path.join(dir, s)
get_filelist(newDir, Filelist)
return Filelist
if __name__ == '__main__':
image_path = r'./transfer_data/office_caltech_10'
source_path = r'../office_caltech_10'
list = get_filelist(image_path, [])
print(len(list))
os.walk()
也可以做到这一点:
# 使用os.walk扫描目录
import os
for curDir, dirs, files in os.walk("test"):
print("====================")
print("现在的目录:" + curDir)
print("该目录下包含的子目录:" + str(dirs))
print("该目录下包含的文件:" + str(files))
分割字符串
os.path.split() 函数
>>> import os
>>> os.path.split('C:/soft/python/test.py')
('C:/soft/python', 'test.py')
>>> os.path.split('C:/soft/python/test')
('C:/soft/python', 'test')
>>> os.path.split('C:/soft/python/')
('C:/soft/python', '')
(完)
os.path.basename() 函数
>>> path='D:\file\cat\dog.jpg'
>>> print(os.path.basename(path))
>
'dog.jpg'
读取txt文件中内容
f = open("xxx.txt", "r")
lines = f.readlines() # 读取全部内容, 并以列表方式返回
for line in lines:
line = line.strip()
shutil.copy(os.path.join(source_path, e.split('/')[-3], e.split('/')[-2], line), os.path.split(e)[0])
print("finish: ", line)
读取csv文件中内容
import numpy as np
data = np.loadtxt(open("路径.csv","rb"),delimiter=",",skiprows=n,usecols=[2,3]) # skiprows中n为0时, 是不跳过; 而usecols中是按0开始计数的
对字符串进行排序
for path, dirs, files in os.walk(file_path):
dirs.sort()
files_tmp = copy.deepcopy(files)
for file in files:
if file.endswith("aedat4"):
files_tmp.remove(file)
if files[0].endswith('aedat') or files[0].endswith('aedat4'):
files = files_tmp
files.sort(key=lambda x: int(x.split('_')[-1][:-6]))
for file in files:
if file.endswith("aedat"):
self.data.append(path + "/" + file)
label_number = classes[os.path.basename(path)]
self.targets.append(label_number)
linux常用命令
命令行快捷键
1. CTRL + U - 剪切光标前的内容
2. CTRL + K - 剪切光标至行末的内容
3. CTRL + Y - 粘贴
4. CTRL + E - 移动光标到行末
5. CTRL + A - 移动光标到行首
6. ALT + F - 跳向下一个空格
7. ALT + B - 跳回上一个空格
8. ALT + Backspace - 删除前一个单词
9. CTRL + W - 剪切光标前一个单词
10. Shift + Insert - 向终端内粘贴文本 (CTRL+SHIFT+V)
查看当前目录下每个子目录的文件数量
查看当前目录下每个子目录的文件数量
find . -maxdepth 1 -type d | while read dir; do count=$(find "$dir" -type f | wc -l); echo "$dir : $count"; done
统计当前文件夹下文件的个数,包括子文件夹里的
ls -lR|grep "^-"|wc -l
统计文件夹下目录的个数,包括子文件夹里的
ls -lR|grep "^d"|wc -l
统计当前文件夹下文件的个数
ls -l |grep "^-"|wc -l
统计当前文件夹下目录的个数
ls -l |grep "^d"|wc -l
移动多个文件到一个文件夹
新建一个move.sh, 内容如下,bash move.sh
即可
#!/bin/bash
# 确保目标文件夹存在
mkdir -p images
# 循环遍历并移动文件夹
for i in $(seq -w 002 659); do
mv "00$i" images/
done
统计特定开头文件夹/ 文件的个数
find -type d -name "main*" |wc -l # 例如查找某目录下以main开头的文件夹个数
find ./ -type f -name "*.rst" | wc -l # 在当前目录及其所有子目录中查找所有以 .rst 结尾的文件,并返回文件总数。
查看文件夹下一级文件夹内存
du -h --max-depth=1
追加内容到文件末尾
echo "要追加的内容" >> 文件名
按用户CPU占用排行
stats=””
echo "% user"
echo "============"
# collect the data
for user in `ps aux | grep -v COMMAND | awk '{print $1}' | sort -u`
do
stats="$stats\n`ps aux | egrep ^$user | awk 'BEGIN{total=0}; \
{total += $4};END{print total,$1}'`"
done
# sort data numerically (largest first)
echo -e $stats | grep -v ^$ | sort -rn | head
#这个 bash 脚本是用来收集并显示系统中每个用户当前使用的 CPU 百分比。具体来说,它将对每个用户的所有进程进行计算,并对其所用的 CPU 百分比进行累加。最后,它会显示使用最多 CPU 的前十名用户。以下是脚本的详细解释:
#stats=””:定义一个空字符串变量 stats,它将用于收集每个用户的 CPU 使用数据。
#echo "% user":打印标题,指示这是一个关于用户的 CPU 使用百分比的报告。
#echo "============":打印分隔线。
#for user in ps aux | grep -v COMMAND | awk '{print $1}' | sort -u``:这是一个循环,用于遍历系统上的每个用户。
#ps aux:列出系统上所有进程的详细信息。
#grep -v COMMAND:从 ps aux 的输出中去除标题行。
#awk '{print $1}':使用 AWK 从每行中提取第一列(即用户列)。
#sort -u:对用户进行排序,并使用 -u 选项来去除重复的用户,这样我们得到一个包含每个用户的唯一名称的列表。
#对于每个 user:
#stats="$stats\n`ps aux | egrep ^$user | awk 'BEGIN{total=0}; {total += $4};END{print total,$1}'":这个命令将每个用户的所有进程的 CPU #使用率累加起来,并将结果添加到 stats 变量中。
#ps aux | egrep ^$user:列出特定用户的所有进程。
#awk 'BEGIN{total=0}; {total += $4};END{print total,$1}':使用 AWK 将每个进程的 CPU 使用率累加(保存在 $4 中),然后打印累加的结果和用户名。
#echo -e $stats | grep -v ^$ | sort -rn | head:处理并显示收集的数据。
#echo -e $stats:打印 stats 变量中的数据。
#grep -v ^$:删除所有空行。
#sort -rn:数值上逆向排序(即从大到小排序)。
#head:只显示前十行(即前十名用户)。
#所以,这个脚本的输出将是系统中前十名 CPU 使用率最高的用户及其使用率。
按用户内存占用大小排行
ps aux | awk '{arr[$1]+=$6} END {for (user in arr) print user, arr[user] / 1024 " MB"}' | sort -nrk 2
# 1. ps aux:显示所有进程的详细信息。
# 2. awk:用于处理输出。它维护了一个名为 arr 的数组,键是用户名,值是 RAM 使用量(以 KB 为单位)。对于每个进程,它会将该进程的 RAM 使用量($6 列)加到相应用户的计数器上。在处理所有进程后,它会为每个用户打印总 RAM 使用量,并将其从 KB 转换为 MB。
# 3. sort -nrk 2:按照第二列(即 RAM 使用量)的数字值对输出进行降序排列。
修改文件夹权限
chmod -R 777 /home/user
详细指令查看:Linux修改目录权限
查看用户,管理员;新增用户
cat /etc/passwd # 查看所有用户
cat /etc/sudoers # 查看管理员
adduser + 用户名 # 新增用户
修改文件夹所属拥有者和用户名
chown www vpsss # 使用chown命令更改文件/文件夹拥有者。www是改后的用户,vpsss是要修改的文件夹名字。
chgrp www vpsss # 使用chgrp命令更改文件所属用户组。上面www是改后的用户组,vpsss是要修改的文件夹名字。
压缩与解压
tar -czvf abc.tgz ./abc #将abc文件夹压缩到abc.tgz
tar zxvf abc.tgz -C ./ # 解压
unrar x test.rar DestPath #解压(会在当前解压目录内产生一个以压缩包名字命名的目录,目录内是解压内容)
tar zxvf abc.tgz --no-same-owner -C ./ # 使用 --no-same-owner 选项:这个选项会告诉 tar 不要尝试设置归档文件中文件的所有权,而是使用当前用户的所有权
tar -zxvf filename.tar.gz -C /path/to/directory # .tar.gz文件是先被tar打包,然后使用gzip压缩的文件;tar:这是Linux中用来打包和解压文件的命令。
#-z:告诉tar命令进行gzip解压。
#-x:告诉tar命令要提取文件。
#-v:表示verbose模式,会在终端中显示解压缩的过程。
#-f:指定要操作的文件名。
unzip -o -d /home/sunny myfile.zip # 把myfile.zip文件解压到 /home/sunny/ -o:不提示的情况下覆盖文件; -d:-d /home/sunny 指明将文件解压缩到/home/sunny目录下;
xz -dk node-v14.15.1-linux-x64.tar.xz # 将.xz解压为.tar
tar -xvf file.tar # 解压tar包
不同服务器传输时排除特定的文件夹
rsync -rtP --exclude='log*/' source@ip:/home/ destination_dir
查找某个被占用端口的进程
sudo lsof -i:29500 # 必须要sudo
查看端口占用情况
netstat -tulnp
防火墙相关
firewall-cmd --state # 查看防火墙状态
firewall-cmd --zone=public --list-ports # 查看防火墙所有开放的端口
firewall-cmd --zone=public --add-port=8888/tcp --permanent # 开放8888端口
firewall-cmd --zone=public --remove-port=8888/tcp --permanent #关闭8888端口
firewall-cmd --reload # 配置立即生效
systemctl stop firewalld.service # 关闭防火墙
查看cpu型号
cat /proc/cpuinfo
linux支持中文,显示不乱码
apt-get install language-pack-zh* # 安装中文支持包
sudo dpkg-reconfigure locales # 第一步选择地区设置,第二步选择默认哪些.
传输时排除某些文件夹
rsync -rt --exclude='log/' yourname@ip:/folder /herefolder # herefolder是要传输到的目的地
mv !(child1|child2) child1 # 需要将除了child1、child2目录的其他文件移动到目录child1下
Linux和Windows下获取文件的Md5
certutil -hashfile <文件名> MD5 # Windows下
md5sum <文件名> # Linux下
查看磁盘及挂载状态
~$ df -h # df命令是用来查看文件系统中硬盘的使用状况的,也可以用来列出系统中挂载的硬盘,使用-h选项可以以人类可读的格式输出硬盘使用状况:
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 55G 3.7G 49G 8% /
udev 2.0G 4.0K 2.0G 1% /dev
tmpfs 394M 776K 394M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 2.0G 220K 2.0G 1% /run/shm
/dev/sda1 487M 3.3M 483M 1% /boot/efi
$ lsblk #lsblk用来查看块设备
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 487M 0 part /boot/efi
├─sda2 8:2 0 55.5G 0 part /
└─sda3 8:3 0 4G 0 part [SWAP]
sdb 8:16 0 50G 0 disk
sr0 11:0 1 1024M 0 rom
$ df <文件(夹)路径> # 查看某个文件夹挂载到的磁盘分区
格式化分区及磁盘挂载请查看:Linux添加新硬盘并挂载(mount)到目录下(注意最后的/etc/fstab配置文件的写入)
df 文件夹强制以GB为单位进行显示
df /mnt/hexiang/ | awk 'NR==1 {print $1, $2/1024/1024 "G", $3/1024/1024 "G", $4/1024/1024 "G", $5, $6} NR>1 {print $1, $2/1024/1024 "G", $3/1024/1024 "G", $4/1024/1024 "G", $5, $6}'
显示文件中指定行
【一】从第3000行开始,显示1000行。即显示3000~3999行
cat filename | tail -n +3000 | head -n 1000
【二】显示1000行到3000行
cat filename| head -n 3000 | tail -n +1000
注意两种方法的顺序。
tail -n 1000:显示最后1000行
tail -n +1000:从1000行开始显示,显示1000行以后的
head -n 1000:显示前面1000行
kill掉所有python进程
sudo pkill python
linux 常见错误与解决
cannot find libtinfow library
sudo ln -s /lib/x86_64-linux-gnu/libtic.so.6.2 /lib/x86_64-linux-gnu/libtinfow.so.6
ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.22‘ not found
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX # 先看看当前有什么版本的GLIBCXX
sudo find / -name "libstdc++.so.6*" # 查看当前系统中其它的同类型文件,找到一个版本比较高的,
# 选一个版本较高的使用之前的指令看看其是否包含需要的版本
cp /root/anaconda3/envs/list/lib/libstdc++.so.6.0.27 /usr/lib/x86_64-linux-gnu/ # 复制
sudo rm /usr/lib/x86_64-linux-gnu/libstdc++.so.6 # 删除软链接
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.27 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 # 创建新链接
# 以上内容均来自
(GPU)nvidia-smi不显示pid
apt-get install psmisc # 安装
fuser -v /dev/nvidia* # 使用命令
# (注:本方法针对docker不显示pid而选择的另外一种间接查看方法)来自:
linux系统显示中文乱码
# 安装中文语言支持
sudo apt-get install language-pack-zh-hans
sudo apt-get install fonts-wqy-zenhei
echo -e '\nexport LANG="zh_CN.UTF-8"\nexport LANGUAGE="zh_CN:zh"' >> ~/.bashrc
sh /root/.bashrc
linux中python文件编码错误: 报错 UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position 52: invalid continuation byte
在开头加上:
#-*- coding : utf-8-*-
# coding:unicode_escape
Linux下载时没有证书 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)
sudo apt install ca-certificates
sudo update-ca-certificates --fresh
export SSL_CERT_DIR=/etc/ssl/certs
python和conda虚拟环境
python修改sys.path的三种方法
方法1,直接修改sys.path列表
设想,如果你的系统允许用户提交自定义的python脚本,那么你可以为此专门创建一个目录用于存放这些脚本,并将这个目录加入到sys.path中,这样,在你的系统里,你可以像引用其他模块一样去引用用户上传的python脚本来执行他们,这就是本文所提到的修改sys.path的三种方法中的一个,你只需要使用sys.path.append方法将目录添加即可。
方法2, 创建.pth文件
另一种修改sys.path的方法时在site-packages目录新建一个.pth文件,帮在文件中加入搜索模块的路径
/root/test
重新启动一个python交互式解释器,输出sys.path,你可以看到/root/test目录也在其中。
方法3,设置PYTHONPATH环境变量
第三种修改方法,通过PYTHONPATH环境变量,我使用export 命令设置该环境变量
[root@sheng studyflask]# export PYTHONPATH=/root/studyflask
[root@sheng studyflask]# echo $PYTHONPATH
/root/studyflask
这种设置方法仅仅是为了验证是否凑效,退出终端后,环境变量就会失效,如果你想永久生效,可以在/etc/profile,或者.bashrc中进行设置,设置完PYTHONPATH后,启动一个新的python交互式解释器,输出sys.path
4, 三种方法比较
从灵活性上比较,方法1最为灵活,搜索目录的位置可以通过调用列表的insert方法自由控制,而方法2所添加的搜索目录会加在sys.path的末尾,方法3会加在列表的开头。
pip 换镜像源
pip install markdown -i https://pypi.tuna.tsinghua.edu.cn/simple # 临时换源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 永久换源
包的优先搜索路径
python -m site # 当前环境的包搜索路径
这里注意如果你是从其他服务器,直接把环境复制到了envs, python -m site 命令可能没显示当前conda环境的python. 这个时候需要ln -s /anaconda/envs/yours/python3.8 /anaconda/envs/yours/python
,即新建一个软连接
pip install xxx时报错:bad interpreter: python3.8:No such file or directory
which pip
which python
## 把which pip中的pip第一行内容换成which python的即可
## 即vim "which pip" 显示的路径,修改第一行为"which python"显示的路径
将conda加到环境变量中
export PATH="/yours/anaconda3/bin/:$PATH"
github常见错误与解决
git push时 [rejected] dev -> dev (non-fast-forward)
git fetch origin dev //获取远程dev分支的修改
git merge origin dev // 合并远程dev分支
git pull origin dev // 更新本地的代码
git add . //重新push
git commit -m "content"
git push origin dev