深度学习的时候难免需要处理各类文件,文件名,但是方法有很多种,按自己的习惯总结了一套。
**

1.文件路径与文件名处理

** 1.1从路径到文件名

首先你需要确定数据所在根目录

path ="/home/User/Script/Model_Test/"

使用pathlib将路径字符串转换为Path对象,读取目录下所有文件,files是一个list类型,每一项是该文件的绝对路径组成的Path对象

from pathlib import Path

pathFolder = Path(path)
files = list(pathFolder.glob("*.*"))
print(type(files))  
 <class 'list'>

files内容:

[
PosixPath('/home/User/Script/Model_Test/2026_03_28_01.txt.tar.gz'),
PosixPath('/home/User/Script/Model_Test/2026_03_28_02.txt'), 
PosixPath('/home/User/Script/Model_Test/2026_03_28_03.txt'), 
PosixPath('/home/User/Script/Model_Test/2026_03_28_04.txt'), 
]

遍历文件

for file in files:

1.2文件名处理

文件名由文件名.后缀组成,Path对象文件名后缀处理:

#绝对路径
print(type(file),file) 
#<class 'pathlib.PosixPath'> /home/User/Script/Model_Test/2026_03_28_01.tar.gz

#含后缀文件名
print(type(file.name),file.name)
#<class 'str'> 2026_03_28_01.tar.gz

#文件最后一个后缀".*"
print(type(file.suffix),file.suffix)
#<class 'str'> .gz

#文件名
print(type(file.stem),file.stem)
#<class 'str'> 2026_03_28_01.tar

#如果碰到.tar.gz文件,没有两个后缀,因为files[0].stem是<class 'str'>
print(file.stem.suffix)
#AttributeError: 'str' object has no attribute 'suffix'

#可以通过再次转化为Path()对象即可
print(type(Path(file.stem).suffix),Path(file.stem).suffix,'\n',
      type(Path(file.stem).stem),Path(file.stem).stem)
#<class 'str'> .tar
#<class 'str'> 2026_03_28_01

Path对象文件名匹配问题:
Path对象的属性Path.stem,Path.name.Path.suffix,都是字符串类型,提取.stem作为字符串处理

fileStem = Path(file.stem).stem
print(type(fileStem),fileStem)
#<class 'str'> 2026_03_28_01

str.split(‘*’)法:适用比较简单的文件名类型,如2026_03_28_01

year = fileStem.split("_")[0]
mouth = fileStem.split("_")[1]
day = fileStem.split("_")[2]
no = fileStem.split("_")[3]
print(type(year),year,"\n",
      type(mouth),mouth,"\n",
      type(day),day,"\n",
      type(no),no
      )

输出:

<class 'str'> 2026 
<class 'str'> 03 
<class 'str'> 28 
<class 'str'> 01

从右边开始拆的str.rsplit(“*”),从左往右返回结果
**正则表达式法:**当文件名较为复杂的时候,如abc219-DEF5687_2687.txt.tar.gz,可以使用正则表达式库re
找全部符合条件的:re.findall(正则表达式,字符串),返回的是列表,列表内每项都是,
找第一个符合条件的:re.search(正则表达式,字符串),返回match对象
拆分:re.split(正则表达式,字符串),
匹配:re.match(正则表达式,字符串)返回match对象
针对match对象分组:re.search().group(),re.match().group(),返回字符串

import re
file = Path('/abc219-DEF2026_03_05_14_00.txt.tar.gz')
fileStem = file.stem
模式说明
\ddigit 单个数字
\d{4}匹配连续四位数字
\d+匹配一个或多个数字
\wword 单个字母、数字、下划线
\w{4}匹配连续四位字母/数字/下划线
\w+匹配一个或多个连续的字母/数字/下划线
\.匹配 “.”(需要转义)
^字符串以xxx开头,如 ^abc
$字符串以xxx结尾,如 abc$
.匹配任意单个字符
.*匹配任意多个字符(含0个)
()括号内的为群组(捕获组)
print('d:\n',
          type(re.findall(r'\d',fileName)),type(re.findall(r'\d',fileName)[0]),re.findall(r'\d',fileName),type(re.findall(r'\d',fileName)[0]),'\n',
          type(re.search(r'\d+',fileName)),re.search(r'\d+',fileName),'\n',
          type(re.search(r'\d{3}',fileName)),re.search(r'\d{3}',fileName),'\n',
          'w:\n',
          type(re.findall(r'\w',fileName)),re.findall(r'\w',fileName),type(re.findall(r'\w',fileName)[0]),'\n',
          type(re.findall(r'\w{2}',fileName)),re.findall(r'\w{2}',fileName),'\n',
          type(re.findall(r'\w+',fileName)),re.findall(r'\w+',fileName),'\n',
          '\.:\n',
          type(re.findall(r'\.',fileName)),re.findall(r'\.',fileName),'\n',
          '^\w+:\n',
          type(re.findall(r'^\w+',fileName)),re.findall(r'^\w+',fileName),'\n',
          '^abc.*:\n',
          type(re.search(r'^abc.*',fileName)),re.search(r'^abc.*',fileName),'\n',
          '.*.tar$:\n',
          type(re.findall(r'.*.tar$',fileName)),re.findall(r'.*.tar$',fileName),'\n'
         )

输出:

d:
 <class 'list'> <class 'str'> ['2', '1', '9', '2', '0', '2', '6', '0', '3', '0', '5', '1', '4', '0', '0'] <class 'str'> 
 <class 're.Match'> <re.Match object; span=(3, 6), match='219'> 
 <class 're.Match'> <re.Match object; span=(3, 6), match='219'> 
 w:
 <class 'list'> ['a', 'b', 'c', '2', '1', '9', 'D', 'E', 'F', '2', '0', '2', '6', '_', '0', '3', '_', '0', '5', '_', '1', '4', '_', '0', '0', 't', 'x', 't', 't', 'a', 'r'] <class 'str'> 
 <class 'list'> ['ab', 'c2', '19', 'DE', 'F2', '02', '6_', '03', '_0', '5_', '14', '_0', 'tx', 'ta'] 
 <class 'list'> ['abc219', 'DEF2026_03_05_14_00', 'txt', 'tar'] 
 \.:
 <class 'list'> ['.', '.'] 
 ^\w+: 
 <class 'list'> ['abc219'] 
 ^abc.*:
 <class 're.Match'> <re.Match object; span=(0, 34), match='abc219-DEF2026_03_05_14_00.txt.tar'> 
 .*.tar$:
 <class 'list'> ['abc219-DEF2026_03_05_14_00.txt.tar'] 

正则表达式返回的的是一个match对象,通过group(0)输出整个match对象的字符串类型,group(n)则是patterns内第n个括号内的字符串:

patterns = r"\w+\d+-\w{3}(\d+)_(\d+)_(\d+)_(\d+)_(\d+).*"
match = re.match(patterns,fileName)
#一般写法,加if:
if match:
   print(f"""all_data = {match.group(0)},{type(match)},{type(match.group(0))}
YY = {match.group(1)},{type(match.group(1))}
MM = {match.group(2)},{type(match.group(2))}
DD = {match.group(3)},{type(match.group(3))}
hh = {match.group(4)},{type(match.group(4))}
dd = {match.group(5)},{type(match.group(5))}
""")

输出:

all_data = abc219-DEF2026_03_05_14_00.txt.tar,<class 're.Match'>,<class 'str'>
YY = 2026,<class 'str'>
MM = 03,<class 'str'>
DD = 05,<class 'str'>
hh = 14,<class 'str'>
dd = 00,<class 'str'>

2.文本文件操作

open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

  • file: 文件路径(字符串或Path对象)
  • mode: 打开模式
  • encoding: 文本编码(如’utf-8’)

文本编码与文件打开模式

模式说明
'r'只读(默认),文件必须存在
'w'只写,文件存在则清空,不存在则创建
'a'追加,文件存在则追加,不存在则创建
'x'独占创建,文件已存在则报错
'b'二进制模式(如 'rb''wb'
't'文本模式(默认)
'+'读写模式(如 'r+''w+'

组合使用示例

  • 'rb':以二进制格式只读打开
  • 'wb':以二进制格式写入(会覆盖)
  • 'a+':以读写模式追加
  • 'r+b':以二进制格式读写打开
path ="/home/User/Script/Model_Test/"
pathFolder = Path(path)
files = list(pathFloder.glob("*.txt"))
    for file in files:
        print("file Name = ",file.name)
        with open(file,"r") as f:
            lines = f.readlines()
            print("readlinesType = ",type(lines),'\n',type(lines[0]),lines[0])
        for line in lines:
            print(len(line))
            cleanline = line.strip()
            print(len(cleanline))

with是一个上下文管理器,自动管理文件,打开后不需要手动关闭
as表示将打开的文件赋值给f
**f.readlines()**表示读取整个文件,返回的是一个列表,每一项是该行的字符串,并且,它包含档尾,换行!
**.strip()**表示移除字符串首尾的指定字符,默认为空白字符

输出:

file Name =  abc-123456.txt
readlinesType =  <class 'list'> 
 <class 'str'> >ABC12345678 (Defghij:klmn901 opqr:STU23456789 vwx:yza01:2345678-9012345)
74
73

3.CSV文件操作

安装pandas库

conda install pandas

pd.read_csv(file_path, index_col=0, header=0) 读取CSV文件

  • file_path - 文件路径
  • index_col=0 - 将第0列(第一列)作为行索引
  • header=0 - 将第0行(第一行)作为列名
表达式说明返回类型
df.loc[primary_key, attribute]行名primary_key列名attribute定位数据由csv文件决定
df.loc[primary_key]整行DataFrame
df.loc[[primary_key1, primary_key2]]多行DataFrame
df.loc[:, attribute]整列DataFrame
df.loc[:, [attribute1, attribute2]]多列DataFrame
df.loc[primary_key, attribute]对应的值具体类型由csv文件决定
df.loc[[primary_key1, primary_key2], [attribute1, attribute2]]多个值(第一个列表是行值,第二个列表是列值)DataFrame
import pandas as pd

path = "/abc.csv"
df = pd.read_csv(path,index_col = 0,header = 0)
print(df.loc['a','b'])

更多推荐