[英]How do I cycle through a csv in python, writing lines to a new file that meet new criteria
[英]How do I make the “for” loop cycle through all lines of a text file in python 3.8?
我有一个包含多行文本的文本文件“abc.txt”。 我正在尝试计算并列出 txt 文件中每个字母 a 到 z 的出现频率。
在下面的代码中,在正确检查字母“a”后,它返回 0 作为从“b”开始的字母表的 rest 的计数。 一旦为字母“a”执行了“for”循环,对于后续的字母,我如何让它再次循环回到文本的开头?
with open(r"C:\Users\username\Downloads\abc.txt","r") as x:
for j in "abcdefghijklmnopqrstuvwxyz":
n = 0
for i in x:
y = i.count(j)
n += y
print(n)
这是因为一旦您读取了整个文件,“指针”或“光标”现在位于文件末尾,没有更多行可读取,因此检查的 rest 以 0 结尾。
要解决此问题,请使用seek()
function 在外部 for 循环的每个循环之后将 cursor 移回文件顶部:
import os
with open(r"C:\Users\username\Downloads\abc.txt","r") as x:
for j in "abcdefghijklmnopqrstuvwxyz":
n = 0
for i in x:
y = i.count(j)
n += y
print(n)
x.seek(0, os.SEEK_SET)
编辑:
在计数之前可能值得将每一行都设为小写:
y = i.lower().count(j)
您的文件句柄x
在迭代后是一个耗尽的迭代器。 在每个计数循环之后,您必须将其重置为文件的开头。 但是在一次迭代中计算所有字母会更有效:
from collections import Counter
cnt = Counter()
with open(r"C:\Users\username\Downloads\abc.txt","r") as x:
for i in x:
cnt.update(i)
for j in "abcdefghijklmnopqrstuvwxyz":
print(cnt[j])
尝试:
count = {}
with open(r"C:\Users\username\Downloads\abc.txt","r") as x:
srt = x.read()
for i in srt:
if i not in count:
count[i] = srt.count(i)
srt.replace(i,'')
第一次使用for i in x
循环遍历文件后,文件已用尽。 for i in x
根本不会运行。
与其直接迭代文件,不如将文件内容加载到可以重复检查的变量中。
此外,看起来您实际上不需要逐行扫描文件; 您可以一步检查整个文件内容。
试试这个代码:
with open(r"C:\Users\username\Downloads\abc.txt","r") as x:
text = x.read()
for letter in "abcdefghijklmnopqrstuvwxyz":
frequency = text.count(letter)
print(frequency)
您可以为此使用Counter
。
from collections import Counter
from string import ascii_lowercase
c = Counter()
letters = set(ascii_lowercase)
with open(r"C:\Users\username\Downloads\abc.txt","r") as f:
c.update(letter for line in f for letter in line if letter in letters)
您不需要为每个字母扫描整个文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.