DOS命令之for /f 中的Delim、Tokens、skip

在写批量创建域用户时,碰到Delims和Tokens,一直不是很清楚,查阅资料后记录下。

“For /f”常用来解析文本,读取字符串。分工上,delims负责切分字符串,而tokens负责提取字符串。如果把字符串当作蛋糕,Delims像刀子,用来切蛋糕,tokens像叉子,用来取切好的蛋糕。下面我们用实例来进行理解。
把以下内容保存为文本文件“歌曲列表.txt”,注意扩展名为“.txt”:

序号、歌手名-歌曲名.后缀名
1、饶天亮-玫瑰爱人.wma
2、高一首-我不愿错过.mp3
3、黃凱芹-傷感的戀人.MP3
4、黄灿-黄玫瑰.lrc
5、黎姿-如此这般的爱情故事.mp3

代码1:显示全部内容

@echo off
for /f %%i in (歌曲列表.txt) do echo %%i
pause>nul

解释:
如果不使用参数“/f”,运行结果只显示括号里的文字字符“歌曲列表.txt”,而不能读取文本文件“歌曲列表.txt”中的内容。可见,“/f”是解析文本字符串的好工具。

delims

只要序号
代码2:默认提取第一列

@echo off
for /f "delims=、" %%i in (歌曲列表.txt) do echo %%i
pause>nul

运行结果:

序号
1
2
3
4
5

解释:
"delims=、"表示定义顿号“、”为分隔符,并用该分隔符“、”切分文本字符串。字符串就是“歌曲列表.txt”里的内容,也就是文件里的文字和标点符号。
该顿号是原文中就有的。除了顿号“、”,原文中还有减号“-”和点号“.”,因此你也可以用它们来做分隔符。
代码3:用减号“-”做分隔符

@echo off
for /f "delims=-" %%i in (歌曲列表.txt) do echo %%i
pause>nul

运行结果:

序号、歌手名
1、饶天亮
2、高一首
3、黃凱芹
4、黄灿
5、黎姿

解释:
因为,当减号“-”被用做分隔符时,每行内容被减号“-”分隔成前后两半,默认只显示前半部分,而后半部分连同分隔符减号“-”都被忽略(省略)了。

代码4:用点号“.”做分隔符

@echo off
for /f "delims=." %%i in (歌曲列表.txt) do echo %%i
pause>nul

运行结果:

序号、歌手名-歌曲名
1、饶天亮-玫瑰爱人
2、高一首-我不愿错过
3、黃凱芹-傷感的戀人
4、黄灿-黄玫瑰
5、黎姿-如此这般的爱情故事

讲解:
默认情况下,单纯使用delims而不用tokens时,只显示第一个分隔符前的内容,第一个分隔符和第一个分隔符后面的内容将被忽略。

代码5:定义多个分隔符

@echo off
for /f "delims=、-." %%i in (歌曲列表.txt) do echo %%i
pause>nul

运行结果:

序号
1
2
3
4
5

注释:
原因是,当定义顿号“、”、减号“-”和点号“.”三个标点符号为分隔符后,原文被分隔成四个部分。
如第二行“1、饶天亮-玫瑰爱人.wma”将被分隔成“1”、“饶天亮”、“玫瑰爱人”和“wma” 四个部分。
从第一行到最后一行,每行的每个部分对应下来相当于一个竖列。因此,原文就有“序号”、“歌手名”、“歌曲名”、“后缀名”四列。
一般情况下,只读取第一列的内容。后面的内容需要用tokens选项提取。

tokens

假如只要歌手名和歌曲名,不要序号和后缀名,如何办到?
代码6:提取单列

@echo off
for /f "tokens=2 delims=、." %%i in (歌曲列表.txt) do echo %%i
pause>nul

运行结果将显示:

歌手名-歌曲名
饶天亮-玫瑰爱人
高一首-我不愿错过
黃凱芹-傷感的戀人
黄灿-黄玫瑰
黎姿-如此这般的爱情故事

讲解:
用delims定义顿号“、”和点号“.”作为分隔符,将原文分成三部分。
如第六行“5、黎姿-如此这般的爱情故事.mp3”被分割成:
第一部分(第一列):5
第二部分(第二列):黎姿-如此这般的爱情故事
第三部分(第三列):mp3
“tokens=2”表示用tokens提取第二列的字符串,即“黎姿-如此这般的爱情故事”。
没有被tokens定义提取的第一列和第三列将被忽略。

假如只要序号和歌曲名,而不要歌手名和后缀名,如何办到?
代码7:提取多列

@echo off
for /f "tokens=1,3 delims=、-." %%i in (歌曲列表.txt) do echo %%i %%j
pause>nul

运行结果将显示:

序号 歌曲名
1  玫瑰爱人
2  我不愿错过
3  傷感的戀人
4  黄玫瑰
5  如此这般的爱情故事

讲解:
“delims=、-.”表示定义顿号、减号和点号为分隔符。
“tokens=1,3”表示只提取第一列和第三列。
“%%i %%j”对应于“token”后面的列数。有多少列就要有多少个输出变量,并且各变量中的字母存在先后顺序。

如何只提取文字,不要标点符号?

代码8:忽略分隔符

@echo off
for /f "tokens=1,2-4 delims=、-." %%i in (歌曲列表.txt) do echo %%i %%j %%k %%l
pause>nul

运行结果:

序号 歌手名 歌曲名 后缀名
1  饶天亮 玫瑰爱人 wma
2  高一首 我不愿错过 mp3
3  黃凱芹 傷感的戀人 MP3
4  黄灿 黄玫瑰 lrc
5  黎姿 如此这般的爱情故事 mp3

讲解:
默认情况下,用做分隔符的标点符号将被忽略。
“tokens=1,2-4”中的“2-4”表示第二至第四列。

skip

skip=n 这里的n指的是跳过开头的n行
并不是说 跳过第n行
代码9

@echo off
for /f "skip=1 tokens=1,2-4 delims=、-."  %%i in (歌曲列表.txt) do echo %%i %%j %%k %%l
pause>nul

运行结果

1 饶天亮 玫瑰爱人 wma
2 高一首 我不愿错过 mp3
3 黃凱芹 傷感的戀人 MP3
4 黄灿 黄玫瑰 lrc
5 黎姿 如此这般的爱情故事 mp3

delims的意义包括两个方面:
第一、指定原文中的标点符号作为分隔符。使得文本被划分为许多小部分,方便使用批处理命令读取和编辑。
第二、读取第一个分隔符之前的内容。忽略第一个分隔符和分隔符后面的内容,如需读取和编辑,需要使用tokens等命令。

Tokens的语法:
FOR /F “tokens=x,y,m-n” %%I IN (Command1) DO Command2
一句话总结:提取列。

Tokens的意义就是,提取指定的列。
注意列与句的联系与区别。
文本内容由许多文字字符串组成,它们被标点符号分隔,两个标点符号之间的语句我们称为“句子”。
当标点符号被“tokens=”指定为分隔符之后,文字将被分成多个部分。对应的每行的每个部分我们称之为“列”。
一列可能是一个句子,也可能包含多个句子,视delims定义的标点符号而定。

其它方面:关于“行”的提取,前面做过一个很简单的:
@echo off
findstr /n .* 12.txt>>122.txt
set /p m=请输入要定位的行:
findstr /b “%m%” 122.txt
pause

转自:http://www.bathome.cn/thread-3483-1-4.html

<think>嗯,用户的问题是关于如何正确使用pandas的read_csv方法从txt文件加载数据到DataFrame,并且需要指定delim_whitespace和header参数,同时还要处理路径字符串的问题。首先,我得回想一下pandas的文档里关于read_csv的参数。记得delim_whitespace是用来指定是否用空白字符作为分隔符的,比如空格或者制表符,而header参数则是用来确定哪一行作为列名,如果文件没有标题行的话应该设置header=None。 然后用户提到路径字符串格式的问题。可能是在Windows系统下,路径的反斜杠需要正确处理,比如使用原始字符串或者双反斜杠。例如,路径应该是r"C:\data\test.txt"或者"C:\\data\\test.txt",避免转义字符的问题。 接下来,我需要检查用户提供的示例代码。用户给出的代码中使用了glob.glob("test*.csv"),然后读取csv文件并追加到test.txt中。但用户现在想从txt文件读取,所以可能需要调整glob的模式,比如"test*.txt"。另外,在读取txt文件时,应该使用read_csv并正确设置参数。 可能用户之前遇到的错误是因为没有正确指定分隔符,导致数据没有被正确解析,或者路径字符串中的反斜杠被转义,导致文件找不到。例如,如果路径是"test\file.txt",Python可能会将\t视为制表符,导致错误,所以应该用r"test\file.txt"或者"test\\file.txt"。 另外,header参数如果设置不当,可能会把数据的第一行当作列名,或者没有列名,导致DataFrame的结构不正确。比如,如果txt文件没有标题行,应该设置header=None,然后可能还需要手动指定列名。 现在需要将这些点整理成一个清晰的步骤,告诉用户如何正确使用read_csv,包括处理路径、设置delim_whitespace和header参数,以及可能的错误处理。同时,要给出示例代码,并解释每个参数的作用,确保用户能够理解并应用。</think>根据您的问题,以下是使用pandas读取txt文件的规范解决方案: ### 一、正确使用read_csv加载txt文件的步骤 1. **路径格式处理**:Windows系统使用原始字符串或双反斜杠 ```python path = r"C:\data\test.txt" # 推荐原始字符串 # 或 path = "C:\\data\\test.txt" ``` 2. **关键参数设置**: - `delim_whitespace=True`:自动识别空格/制表符分隔 - `header=None`:无列标题时使用 - `names=[列名列表]`:自定义列标题(可选) 3. **完整示例代码**: ```python import pandas as pd # 读取无表头、空格分隔的txt文件 df = pd.read_csv( r"D:\data\test.txt", delim_whitespace=True, header=None, names=["col1", "col2", "col3"] ) ``` ### 二、参数解析表 | 参数 | 作用 | 典型值 | |------|------|--------| | delim_whitespace | 自动处理空格/制表符 | True/False | | header | 指定标题行 | None(无标题)/0(首行) | | names | 自定义列名 | ["name1","name2"] | | dtype | 指定列数据类型 | {"col1": int} | | skiprows | 跳过起始行 | 2 或 [0,1] | | na_values | 定义空值标记 | ["NA", "null"] | ### 三、常见错误修复 1. **路径错误**:使用`os.path.exists(path)`验证路径有效性 2. **编码问题**:添加`encoding="utf-8"`参数 3. **混合分隔符**:优先使用`sep=r"\s+"`正则表达式 4. **科学计数法解析**:设置`float_precision="high"` ### 四、进阶技巧 ```python # 读取含混合分隔符的文件 pd.read_csv("data.txt", sep=r"\s+", engine="python") # 处理大文件 chunker = pd.read_csv("bigfile.txt", delim_whitespace=True, chunksize=10000) for chunk in chunker: process(chunk) ``` [^1]: 关于read_csv的更多参数细节可参考pandas官方文档第24.2章文件I/O部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值