python文本txt处理

本文详细介绍了Python中三种常见的文件读取方法:read(), readlines() 和 readline() 的使用技巧及注意事项,包括如何处理行尾符、去除空行以及文本预处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读操作

总结写在前面,三个方法:

  • read() + splitlines()
  • readlines() + strip()
  • readline() + 循环

假设有test.txt文件内容为:

banana,apple,orange
cat, dog, pig
father, mother, child
man, woman, human

三种写法:
1. read()方法

with open('test.txt') as f:
    data = f.read()
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输出:

type:  <class 'str'>
len:  76
data: 
banana,apple,orange
cat, dog, pig
father, mother, child
man, woman, human

可以看出,read()方法把整个txt的内容读入,且作为一个字符串来处理。那如果我们想要按行分开,可以调用字符串的splitlines()方法,将字符串分为字符串list。spitines()以换行符\n,回车符\r, 回车+换行\r\n为标志,将字串分开。

with open('test.txt') as f:
    data = f.read().splitlines()
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输出:

type:  <class 'list'>
len:  4
data: 
['banana,apple,orange', 'cat, dog, pig', 'father, mother, child', 'man, woman, human']

ps:splitlines()将字串分开成字串列表,.join()方法可以将列表组合成字串:

print("".join(data))

输出:

banana,apple,orangecat, dog, pigfather, mother, childman, woman, human

2. readlines()方法

with open('test.txt') as f:
    data = f.readlines()
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输出:

type:  <class 'list'>
len:  4
data: 
['banana,apple,orange\n', 'cat, dog, pig\n', 'father, mother, child\n', 'man, woman, human\n']

可以看到,输出结果是以每行的字串为一个元素,组成了字符串列表。但是和read()+splitlines()方法的区别是,每一个元素多了一个\n回车符,也就是readlines()默认是不会去除行尾的换行符的。需要用strip()方法来手动去除。代码如下:

with open('test.txt') as f:
    data = f.readlines()
    data = [d.strip() for d in data]
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输出如下:

type:  <class 'list'>
len:  4
data: 
['banana,apple,orange', 'cat, dog, pig', 'father, mother, child', 'man, woman, human']

strip()方法如果不写参数,则用于去除字串首尾的空白字符,包括空格,回车,换行。注意只去除首尾,不去除中间
strip()如果带参数,则参数中的每一个字符,都在行首和行尾进行匹配,遇到了,就进行消除。

string = '  \r  \n abc \r\n \n '

print(string.strip())
print(len(string.strip()))

输出如下:

abc
3
string = 'aaa0bbb0ccc'

print("a: ", string.strip("a"))
print("0: ", string.strip("0"))
print("b: ", string.strip("b"))
print("c: ", string.strip("c"))
print("0abc: ", string.strip("0abc"))

输出:

a:  0bbb0ccc
0:  aaa0bbb0ccc
b:  aaa0bbb0ccc
c:  aaa0bbb0
0abc:  

可以看到“0abc”输出为空。
现在可以理解上文那句:**“则参数中的每一个字符,都在行首和行尾进行匹配,遇到了,就进行消除。”**了吧。

3. readline()方法
readline()跟readlines()类似,但是一次只能读一行,所以需要循环控制。

with open('test.txt') as f:
    while True:
        line = f.readline()
        if not line:
            break
        print(line)

输出:

banana,apple,orange

cat, dog, pig

father, mother, child

man, woman, human

可以看到,行尾也是带\n回车的,使用strip()去除。

with open('test.txt') as f:
    while True:
        line = f.readline().strip()
        if not line:
            break
        print(line)

输出:

banana,apple,orange
cat, dog, pig
father, mother, child
man, woman, human

番外1. 去除文本开头和结尾的空行
经常会要到另外一种问题,在一个txt的文本的开头和结尾处,存在一些空行,对我们是无用的,需要进行去除,这个怎么操作?

很简单,结合上面讲到的方法,read()将整个文本当作一个字符串读入,strip()可以去除行首和行尾的空白字符,splitlines()可以将字串按照换行符进行分割,那么,解决方案如下:
假设文本内容为:


banana,apple,orange
cat, dog, pig
father, mother, child
man, woman, human




其中开头一个空行,结尾两个空行,
用1的方法:

with open('test.txt') as f:
    data = f.read().splitlines()
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输入如下:

type:  <class 'list'>
len:  8
data: 
['', 'banana,apple,orange', 'cat, dog, pig', 'father, mother, child', 'man, woman, human', '', '', '']

可以看到len为8,首尾多了几个空行。
处理代码如下:

with open('test.txt') as f:
    data = f.read().strip().splitlines()
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输出:

type:  <class 'list'>
len:  4
data: 
['banana,apple,orange', 'cat, dog, pig', 'father, mother, child', 'man, woman, human']

可以看到,将原来的data = f.read().splitlines()变为了data = f.read().strip().splitlines(),多加了.strip(), txt首和尾的空行就被去除了。

去掉txt 中的空格

def de_blank(file_name):
	with open(file_name) as f:
		data = f.read().strip().splitlines()
		data = [d.strip() for d in data] #去掉行首行尾空格
		data = [d for d in data if d[0]!='#'] #去掉注释行
		data = [d for d in data id d.find(':')<0] # 去掉包含:符号的行
		data = [d.replace(' ', '') for d in data] # 去掉行中的空格
		return data

其实上面的多行可以合并成一行:

def de_blank(file_name):
	with open(file_name) as f:
		data = f.read().strip().splitlines()
		data = [d.strip() for d in data] #去掉行首行尾空格
		data = [d.replace(' ','') for d in data if d[0]!='#' and d.find(':')<0]
		return data

一个非常机智的列表表达式

a = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6], 去除列表a中的元素0,如果元素0后面的元素为2的话。

a = [i[0] for i in zip(a, a[1:]+[None]) if x!=(0,2)]

实际应用

def txt2array(filename):
    with open(filename) as f:
        data = f.read().strip().splitlines()
        data = [d.strip() for d in data] #去掉行首行尾空格
        data = [d[1:-1] for d in data]
        data = [d.split(',') for d in data]
        return np.array(data, dtype=np.float64)
<think>好的,我现在需要回答用户关于Python中f.read().splitlines()方法的问题。首先,我得回忆一下这个方法的具体用法和常见问题。 用户提到了几个引用,特别是引用[2]和引用[3],其中提到splitlines()返回一个列表,并且不会包含换行符,而readlines()会保留换行符。这可能是一个关键点,用户可能想知道两者的区别以及如何正确使用splitlines()。 首先,我应该明确splitlines()的作用。根据Python文档,str.splitlines()方法会根据换行符(如\n、\r\n等)分割字符串,并返回一个列表,默认会去掉换行符。而readlines()方法则是读取文件所有行,每行作为列表的一个元素,但保留每行的换行符。因此,当用户使用f.read().splitlines()时,实际上是将整个文件内容读取为一个字符串,然后用splitlines()分割成行列表,同时去掉换行符。 接下来,用户可能需要一个使用示例。我需要编写一个代码示例,展示如何正确使用read().splitlines()。例如,打开一个文件,读取内容并用splitlines()处理,然后遍历每一行。同时,需要指出处理后的每行不包含换行符,这在处理文本时很重要,比如比较或处理字符串时不需要额外去除换行符。 用户可能遇到的问题包括文件路径错误、编码问题,或者对结果列表中的元素是否有换行符存在疑问。例如,在引用[4]中,用户可能混淆了split('\n')和splitlines()的区别,前者会在每个元素后保留空字符串(如果最后一行以换行符结尾),而splitlines()不会保留这些空字符串。 另外,引用[5]提到了使用.rsplit(),这可能是一个相关但不同的方法。需要明确splitlines()与split()的区别,尤其是在处理不同换行符时的行为差异。 还需要考虑编码问题,比如在打开文件时指定正确的编码格式(如utf8),否则可能会出现解码错误。例如,在引用[2]的代码示例中,使用了encoding="utf8",这是一个好的做法,应该在示例中强调这一点。 最后,总结常见问题,比如换行符处理、编码错误、文件路径问题等,并给出相应的解决方法。同时,生成相关问题,帮助用户进一步理解相关方法的使用和潜在问题。</think>### Python中`f.read().splitlines()`的用法解析 `f.read().splitlines()`是Python处理文本文件的常用方法,用于**将文件内容按行分割为列表,并自动去除每行的换行符**。以下是具体说明和示例: --- #### 1. **基础用法** ```python with open('data.txt', 'r', encoding='utf-8') as f: lines = f.read().splitlines() # 读取文件并分割为列表 for line in lines: print(line) # 每行不包含换行符\n ``` - **作用**:将文件内容一次性读入字符串,再按行分割为列表。 - **特点**:与`f.readlines()`不同,`splitlines()`会自动去掉每行的换行符[^2][^3]。 --- #### 2. **对比`splitlines()`与`split('\n')`** ```python content = "Line1\nLine2\r\nLine3" print(content.splitlines()) # 输出:['Line1', 'Line2', 'Line3'] print(content.split('\n')) # 输出:['Line1', 'Line2\r', 'Line3'] ``` - **区别**: - `splitlines()`:支持多种换行符(如`\n`、`\r\n`),且不保留空行。 - `split('\n')`:仅按`\n`分割,可能产生空字符串(如末尾有`\n`时)[^4]。 --- #### 3. **常见问题解决** - **问题1:文件路径错误** ```python # 错误示例:路径未正确转义 with open('D:\test\data.txt', 'r') as f: # 报错!路径中的\t会被解析为制表符 # 正确写法:使用原始字符串或双反斜杠 with open(r'D:\test\data.txt', 'r') as f: # 推荐 ``` - **问题2:编码不一致** ```python # 错误示例:文件编码为gbk但未指定 with open('data.txt', 'r') as f: # 可能抛出UnicodeDecodeError # 正确写法:明确指定编码 with open('data.txt', 'r', encoding='gbk') as f: # 根据实际编码调整 ``` - **问题3:处理大文件效率低** ```python # 避免对大文件使用read().splitlines(),改用逐行读取 with open('large_file.txt', 'r') as f: for line in f: # 逐行读取,内存友好 line = line.rstrip('\n') # 手动去除换行符 ``` --- #### 4. **典型应用场景** - **场景1:配置文件解析** ```python with open('config.ini', 'r') as f: config_lines = f.read().splitlines() # 过滤注释行(以#开头) settings = [line for line in config_lines if not line.startswith('#')] ``` - **场景2:数据清洗** ```python with open('data.csv', 'r') as f: rows = f.read().splitlines() # 去除空行 cleaned_rows = [row for row in rows if row.strip() != ''] ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值