每次都用到,每次都得查,很烦。这里记录常用的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