python:文本文件处理,for循环和读操作冲突
python: text file processing, for loop and read operation conflict
我正在 Python 学习编码。现在我正在试验来自 here.
的文件比较程序
我的代码是:
#!/usr/bin/python3
def main():
fhand1 = open('mbox.txt')
print('file handle for mbox is {}'.format(fhand1))
count = 0
for l1 in fhand1:
count = count + 1
l1 = l1.rstrip() # Skip 'uninteresting lines'
if l1.startswith('From:'):
print('{}'.format(l1))
print('Numer of lines: {}'.format(count))
fhand2 = open('mbox-short.txt')
#inp = fhand2.read(), when here for loop does not work
#for l2 in fhand2:
#if l2.startswith('From:'):
#print('{}'.format(l2))
inp = fhand2.read()#if for loop is active then this doesnot work
print('Total characters in mbox-short: {}'.format(len(inp)))
print('First 20 characters on mbox-short: {}'.format(inp[:56]))
if __name__ == "__main__": main()
我的问题是 'mbox-short.txt'。当我将 inp = fhand2.read()
放在 for l2 in fhand2: {}
之前时,for 循环不会 运行。当我更改顺序时,read()
操作不起作用。
有人可以解释一下吗?
顺便说一句,我正在使用 JetBrains PyCharm Community Ed 4 IDE.
提前谢谢你。
read()
方法会将整个文件读入一个字符串。
所以如果说你的文件看起来像
1 2 3 4
5 6 7 8
这将 return "1 2 3 4\n5 6 7 8\n"
。所以当你说 for l2 in fhand2
时,它会循环遍历这个字符串。因此,您基本上遍历了字符串中的每个元素。即 1
、</code>、<code>2
等。
如果您想逐行阅读,可以使用 readline()
来获取下一行,或者使用 readlines()
来获取列表,例如 - ["1 2 3 4\n", "5 6 7 8\n"]
inp = fhand2.readlines() 应该可以解决您的问题。
仅供参考
How do I read a file line-by-line into a list?
这里发生的是读取操作在您分配变量时返回文件的完整内容(因此将插入符号放在文件末尾),这就是您收到空字符串的原因。
您需要这样做:
fhand2 = open('mbox-short.txt')
inp = fhand2.read() # uncomment the first read operation
for l2 in fhand2:
if l2.startswith('From:'):
print('{}'.format(l2))
# inp = fhand2.read() comment out the second one
或者这个:
fhand2 = open('mbox-short.txt')
inp = fhand2.read()
for l2 in fhand2:
if l2.startswith('From:'):
print('{}'.format(l2))
fhand2 = open('mbox-short.txt') # re-open the file you have already read
inp = fhand2.read()
查看更多信息 python i/o here.
通过在文件对象上调用 .read() 可以清空它,因此不能再遍历它的元素。您可以通过使用可选的 [size] 参数调用 read 来测试它。 mbox-short.txt 的大小为 94626。使用 94625 调用 read 会将文件的前 94625 个字节读入字符串。您可以循环遍历文件对象中剩余的 1 个字节(即换行符 \n)。 file.read([size]) 默认情况下将整个文件读入一个字符串,因此没有任何要迭代的内容。
filehandle = open("mbox-short.txt")
fileString = filehandle.read(94625)
print (len(fileString))
count = 0
for x in filehandle:
print (x)
count += 1
print (count)
参见:
https://docs.python.org/2/library/stdtypes.html?highlight=read#file.read
(我在 python3 文档中找不到 file.read(),但我认为它在各个版本中都没有改变)
我正在 Python 学习编码。现在我正在试验来自 here.
的文件比较程序我的代码是:
#!/usr/bin/python3
def main():
fhand1 = open('mbox.txt')
print('file handle for mbox is {}'.format(fhand1))
count = 0
for l1 in fhand1:
count = count + 1
l1 = l1.rstrip() # Skip 'uninteresting lines'
if l1.startswith('From:'):
print('{}'.format(l1))
print('Numer of lines: {}'.format(count))
fhand2 = open('mbox-short.txt')
#inp = fhand2.read(), when here for loop does not work
#for l2 in fhand2:
#if l2.startswith('From:'):
#print('{}'.format(l2))
inp = fhand2.read()#if for loop is active then this doesnot work
print('Total characters in mbox-short: {}'.format(len(inp)))
print('First 20 characters on mbox-short: {}'.format(inp[:56]))
if __name__ == "__main__": main()
我的问题是 'mbox-short.txt'。当我将 inp = fhand2.read()
放在 for l2 in fhand2: {}
之前时,for 循环不会 运行。当我更改顺序时,read()
操作不起作用。
有人可以解释一下吗?
顺便说一句,我正在使用 JetBrains PyCharm Community Ed 4 IDE.
提前谢谢你。
read()
方法会将整个文件读入一个字符串。
所以如果说你的文件看起来像
1 2 3 4
5 6 7 8
这将 return "1 2 3 4\n5 6 7 8\n"
。所以当你说 for l2 in fhand2
时,它会循环遍历这个字符串。因此,您基本上遍历了字符串中的每个元素。即 1
、</code>、<code>2
等。
如果您想逐行阅读,可以使用 readline()
来获取下一行,或者使用 readlines()
来获取列表,例如 - ["1 2 3 4\n", "5 6 7 8\n"]
inp = fhand2.readlines() 应该可以解决您的问题。 仅供参考 How do I read a file line-by-line into a list?
这里发生的是读取操作在您分配变量时返回文件的完整内容(因此将插入符号放在文件末尾),这就是您收到空字符串的原因。
您需要这样做:
fhand2 = open('mbox-short.txt')
inp = fhand2.read() # uncomment the first read operation
for l2 in fhand2:
if l2.startswith('From:'):
print('{}'.format(l2))
# inp = fhand2.read() comment out the second one
或者这个:
fhand2 = open('mbox-short.txt')
inp = fhand2.read()
for l2 in fhand2:
if l2.startswith('From:'):
print('{}'.format(l2))
fhand2 = open('mbox-short.txt') # re-open the file you have already read
inp = fhand2.read()
查看更多信息 python i/o here.
通过在文件对象上调用 .read() 可以清空它,因此不能再遍历它的元素。您可以通过使用可选的 [size] 参数调用 read 来测试它。 mbox-short.txt 的大小为 94626。使用 94625 调用 read 会将文件的前 94625 个字节读入字符串。您可以循环遍历文件对象中剩余的 1 个字节(即换行符 \n)。 file.read([size]) 默认情况下将整个文件读入一个字符串,因此没有任何要迭代的内容。
filehandle = open("mbox-short.txt")
fileString = filehandle.read(94625)
print (len(fileString))
count = 0
for x in filehandle:
print (x)
count += 1
print (count)
参见: https://docs.python.org/2/library/stdtypes.html?highlight=read#file.read
(我在 python3 文档中找不到 file.read(),但我认为它在各个版本中都没有改变)