python - 如何确定文件中的行是否为空白,或者仅将填充的行写入文件,python 3x
问题描述
我试图读入一个文件,然后把它写出来,去掉所有的“空白”行。我的意思不是去掉所有空白的线条。我想保留所有缩进。我只想摆脱文本行之间的空白行。我打算用循环读取字符串并取出所有空行,但我对如何定义空行有点困惑。您不必逐个循环变量 char 来确定这一点。对吗?它似乎是一个“\n”,前后没有字符。基本上只有一个“\ n”,但到目前为止我还无法定义它。所以我推迟了在读取和写入文件时尝试逐行执行此操作。该文件需要保持缩进完整性,否则它将无法运行。
lines = []
with open(file_name, mode='r+', encoding='utf-8') as f:
for line in f:
if len(line) > 2:
lines.append(line)
print(len(line))
for line in f:
f.write((str(line) for line in lines))
我只调用了打印函数来告诉我在读入时一行中有多少个字符,而且空白行似乎只读取为 1 个字符。(“\n”我假设?)所以我试图只附加任何内容> 1. 到目前为止,它只是将其准确地写入文件中。正如此处所示,我对使用 write 方法的态度也不是 100。大约 10 天前,我刚刚开始使用 python,我确定我做错了什么,这很可能真的很容易。
解决方案
您的代码有几个问题:
- 测试长度不是检查空行的安全方法(文件的最后一行可能不会以换行符终止,如果它只有一个字符,你会丢弃它)。
- 您不会
seek
回到文件的开头,因此您永远不会替换当前数据;该文件已用尽,因此第二个循环永远不会发生。 - 您不能调用
write
生成器表达式;它不是一个字符串,所以如果它执行它就会死掉。 - 多亏了#2,#3 不会咬你,因为第二个循环永远不会运行(它试图循环一个用尽的文件,它没有要循环的行)。
固定代码:
lines = []
with open(file_name, mode='r+', encoding='utf-8') as f:
for line in f:
if line.rstrip('\n'): # Check if it's empty after removing EOL character
lines.append(line)
print(len(line))
f.seek(0) # Seek back to beginning of file so you overwrite existing data
f.writelines(lines) # Write out all the lines (they're already str, so no need to convert
# and writelines handles an iterable of lines, write doesn't)
f.truncate() # Truncate file to current file location so excess data removed
推荐阅读
- sorting - 如何根据第四列选择包含每个 ID 的指数值的最小值?
- python - Python将sql数据字符串转换为列表
- maximo - 更新服务地址时调用自动脚本(具有 WO 对象启动点)?
- javascript - 如何在承诺中检索数组值?(未捕获(承诺中)TypeError:无法读取未定义的属性“tabId”)
- php - 用于汇总多个计数数据的 MySQL 语法
- sql - 如何更新 AWS Athena 表中的列
- excel - 在 Excel 中,使用 VBA 的 PDF 工作表范围
- java - 创建一个从 1 到 10 的随机数字数组。然后,在 java 中将所有 7 移动到数组的前面
- cron - mount_smbfs 在 crontab 中失败并显示“mount_smbfs:无法打开连接:syserr = 身份验证错误”
- google-sheets - 创建一个查询,该查询将根据 Google 表格中下拉菜单中的多个条件进行过滤