Python 将整个文件读成一行
Python reading the entire file as one line
我有一个如下所示的数据文件。
Index Code Pos1 Strand Chr2 Pos2 length blocks
1 G32_bkd.ctx:Vu01(old4) 62739 47+9- Vu01(old4) 63651 790 0
2 G32_bkd.ctx:Vu01(old4) 441403 10+0- Vu01(old4) 446263 4893 0
3 G32_bkd.ctx:Vu01(old4) 450546 15+0- Vu01(old4) 451091 576 0
4 G32_bkd.ctx:Vu01(old4) 459741 10+0- Vu01(old4) 460841 1068 0
5 G32_bkd.ctx:Vu01(old4) 612262 14+0- Vu01(old4) 629013 16788 0
6 G32_bkd.ctx:Vu01(old4) 688380 23+0- Vu01(old4) 693207 4872 0
7 G32_bkd.ctx:Vu01(old4) 730643 12+0- Vu01(old4) 740497 7011 0
8 G32_bkd.ctx:Vu01(old4) 834116 16+1- Vu01(old4) 835797 1752 0
我想单独读取 header 行,然后在 for 循环中读取每一行。我的代码是
with open(file) as f:
title_line = f.readline()
for line in f:
line = line.strip()
cols = line.split()
当我在 for
循环中检查 print(line)
时,它没有打印任何内容。但是当我选中 print(title_line)
时,整个文件都会打印出来,保留文件中的确切格式。什么地方出了错?
N.B。所以,我只是复制并粘贴了整个文件并以不同的名称保存它,它工作得很好。
假设您有一个文件 'yourfile.txt' 并且它的大小不大。
f = open('yourfile.txt','r')
跳过阅读行中的 title_line。
for line in f.readlines()[1:]:
line = line.strip()
cols = line.split()
# output the result
print ",".join(x for x in cols)
如果 Python 出于某种原因不喜欢原始文件中的行尾字符,可能会导致该行为。
为了确认,您可以在 Linux 上使用 od -t a file | less
,并检查其中的内容。也许该文件符合不同的操作系统标准?如果不在 Linux 上,您可以使用 Python 本身来打印带有 ord
的每个字符以查看它正在使用什么(\n、\r、\r\n)。
如果是这种情况,您有一些选择:
- 对于 Python 2,您可以在 通用换行符 模式下打开文件。即"U":
open (file, "U")
- 这是一种快速简便的方法来确认这确实是问题并解决它,但不建议长期使用
- 否则,您可以使用
io.open
代替open
,并使用其newline=
参数。默认值 None
应该是您需要的。
如果这不能解决您的问题,请提供:
- 您使用的操作系统
- 您正在使用的 Python 版本
- 原始文件的源操作系统
作为不相关的旁注,我建议您检查 Python 的内置 csv
模块来读取您的文件。看起来非常合适(csv
模块可以配置为使用空格或制表符,而不是逗号)
参考文献
我有一个如下所示的数据文件。
Index Code Pos1 Strand Chr2 Pos2 length blocks
1 G32_bkd.ctx:Vu01(old4) 62739 47+9- Vu01(old4) 63651 790 0
2 G32_bkd.ctx:Vu01(old4) 441403 10+0- Vu01(old4) 446263 4893 0
3 G32_bkd.ctx:Vu01(old4) 450546 15+0- Vu01(old4) 451091 576 0
4 G32_bkd.ctx:Vu01(old4) 459741 10+0- Vu01(old4) 460841 1068 0
5 G32_bkd.ctx:Vu01(old4) 612262 14+0- Vu01(old4) 629013 16788 0
6 G32_bkd.ctx:Vu01(old4) 688380 23+0- Vu01(old4) 693207 4872 0
7 G32_bkd.ctx:Vu01(old4) 730643 12+0- Vu01(old4) 740497 7011 0
8 G32_bkd.ctx:Vu01(old4) 834116 16+1- Vu01(old4) 835797 1752 0
我想单独读取 header 行,然后在 for 循环中读取每一行。我的代码是
with open(file) as f:
title_line = f.readline()
for line in f:
line = line.strip()
cols = line.split()
当我在 for
循环中检查 print(line)
时,它没有打印任何内容。但是当我选中 print(title_line)
时,整个文件都会打印出来,保留文件中的确切格式。什么地方出了错?
N.B。所以,我只是复制并粘贴了整个文件并以不同的名称保存它,它工作得很好。
假设您有一个文件 'yourfile.txt' 并且它的大小不大。
f = open('yourfile.txt','r')
跳过阅读行中的 title_line。
for line in f.readlines()[1:]:
line = line.strip()
cols = line.split()
# output the result
print ",".join(x for x in cols)
如果 Python 出于某种原因不喜欢原始文件中的行尾字符,可能会导致该行为。
为了确认,您可以在 Linux 上使用 od -t a file | less
,并检查其中的内容。也许该文件符合不同的操作系统标准?如果不在 Linux 上,您可以使用 Python 本身来打印带有 ord
的每个字符以查看它正在使用什么(\n、\r、\r\n)。
如果是这种情况,您有一些选择:
- 对于 Python 2,您可以在 通用换行符 模式下打开文件。即"U":
open (file, "U")
- 这是一种快速简便的方法来确认这确实是问题并解决它,但不建议长期使用
- 否则,您可以使用
io.open
代替open
,并使用其newline=
参数。默认值None
应该是您需要的。
如果这不能解决您的问题,请提供:
- 您使用的操作系统
- 您正在使用的 Python 版本
- 原始文件的源操作系统
作为不相关的旁注,我建议您检查 Python 的内置 csv
模块来读取您的文件。看起来非常合适(csv
模块可以配置为使用空格或制表符,而不是逗号)
参考文献