ここに質問があります:
これらの単語を含むファイルがあります。
hey how are you
I am fine and you
Yes I am fine
そして、単語、行、文字の数を見つけるように求められます。
以下は私のプログラムですが、スペースのない文字のカウント数は正しくありません。
単語の数が正しく、行の数が正しい。同じループの間違いは何ですか?
fname = input("Enter the name of the file:")
infile = open(fname, 'r')
lines = 0
words = 0
characters = 0
for line in infile:
wordslist = line.split()
lines = lines + 1
words = words + len(wordslist)
characters = characters + len(line)
print(lines)
print(words)
print(characters)
出力は次のとおりです。
lines=3(Correct)
words=13(correct)
characters=47
私はこのサイトを複数の回答で見ましたが、Pythonの他の機能を学んでいないので混乱しています。私がやったループのように単純で基本的なコードを修正するにはどうすればよいですか?
一方、スペースなしの文字数は35で、スペースありの文字数は45です。可能であれば、スペースなしの文字数を見つけたいです。たとえ誰かがスペースのある文字数のループを知っていても大丈夫です。
1行のすべての単語の長さを合計します。
characters += sum(len(Word) for Word in wordslist)
プログラム全体:
with open('my_words.txt') as infile:
lines=0
words=0
characters=0
for line in infile:
wordslist=line.split()
lines=lines+1
words=words+len(wordslist)
characters += sum(len(Word) for Word in wordslist)
print(lines)
print(words)
print(characters)
出力:
3
13
35
この:
(len(Word) for Word in wordslist)
ジェネレータ式 です。基本的に、各Wordの長さを生成する1行のループです。これらの長さをsum
に直接送ります:
sum(len(Word) for Word in wordslist)
このバージョンは enumerate
を利用しているため、読みやすさを維持しながら2行のコードを保存します。
with open('my_words.txt') as infile:
words = 0
characters = 0
for lineno, line in enumerate(infile, 1):
wordslist = line.split()
words += len(wordslist)
characters += sum(len(Word) for Word in wordslist)
print(lineno)
print(words)
print(characters)
この行:
with open('my_words.txt') as infile:
インデントを離れるとすぐに閉じることを約束してファイルを開きます。ファイルを使い終わったら、ファイルを閉じることをお勧めします。
各行(最後の行を除く)には行区切り記号があることに注意してください。つまりWindowsの場合は「\ r\n」、LinuxおよびMacの場合は「\ n」。
したがって、この場合は45ではなく47のように、正確に2文字が追加されます。
これを克服する良い方法は以下を使用することです。
import os
fname=input("enter the name of the file:")
infile=open(fname, 'r')
lines=0
words=0
characters=0
for line in infile:
line = line.strip(os.linesep)
wordslist=line.split()
lines=lines+1
words=words+len(wordslist)
characters=characters+ len(line)
print(lines)
print(words)
print(characters)
これはコメントするには長すぎます。
Python 2または3?本当にmattersなので。 REPLの両方で以下を試してください:
Python 2.7.12
>>>len("taña")
5
Python 3.5.2
>>>len("taña")
4
え?答えはユニコードにあります。それ ñ
は、発音区別符号を組み合わせた「n」です。その1文字を意味しますが、1バイトではありません。したがって、プレーンASCIIテキストで作業している場合を除き、python文字カウント関数がfor =。
私はこの解決策を非常に簡単で読みやすいと見つけました:
with open("filename", 'r') as file:
text = file.read().strip().split()
len_chars = sum(len(Word) for Word in text)
print(len_chars)
文字を数えるには、個々のWordを数える必要があります。したがって、文字をカウントする別のループを作成できます。
_for Word in wordslist:
characters += len(Word)
_
それはそれを行うべきです。単語リストは、おそらく右側の改行文字を削除する必要があります。おそらくwordslist = line.rstrip().split()
のようなものです。
おそらく改行文字をカウントしています。 (lines + 1)で文字を引く
コードは次のとおりです。
fp = open(fname, 'r+').read()
chars = fp.decode('utf8')
print len(chars)
出力を確認してください。私はそれをテストしました。
他のPythonソリューションよりも:
_with open('foo.txt') as f:
text = f.read().splitlines() # list of lines
lines = len(text) # length of the list = number of lines
words = sum(len(line.split()) for line in text) # split each line on spaces, sum up the lengths of the lists of words
characters = sum(len(line) for line in text) # sum up the length of each line
print(lines)
print(words)
print(characters)
_
ここでの他の答えは、str.splitlines()
が行うことを手動で行うことです。車輪を再発明する理由はありません。
あなたは正しい答えを持っています-あなたのコードは完全に正しいです。私がやっていると思うことは、通過する行末文字があり、それにはあなたの文字カウントが2つ含まれていることです(移動する新しい行がないので、最後の行に1つはありません)。これを削除したい場合、単純なファッジは、ローフが示唆したようにすることです
characters = characters - (lines - 1)
2番目の部分についてはcslの回答を参照してください...
2つの問題があります。 1つは行末で、もう1つはその間のスペースです。
今ではかなり良い回答を投稿した人がたくさんいますが、この方法は理解しやすいと思います。
characters = characters + len(line.strip()) - line.strip().count(' ')
line.strip()は、末尾と先頭のスペースを削除します。次に、合計の長さからスペースの数を引いています。
len
の呼び出し中に不要な文字をスキップするだけで、
import os
characters=characters+ len([c for c in line if c not in (os.linesep, ' ')])
またはsum
カウント、
characters=characters+ sum(1 for c in line if c not in (os.linesep, ' '))
または、str
からwordlist
を作成し、len
を取得します。
characters=characters+ len(''.join(wordlist))
またはsum
の文字[wordlist
。これが最速だと思います。
characters=characters+ sum(1 for Word in wordlist for char in Word)
とても簡単です:
f = open('file.txt', 'rb')
f.seek(0) # Move to the start of file
print len(f.read())
ここでは、問題のメモリ使用量が少ない最小のプログラムを取得しました
with open('FileName.txt') as f:
lines = f.readlines()
data = ''.join(lines)
print('lines =',len(lines))
print('Words = ',len(data.split()))
data = ''.join(data.split())
print('characters = ',len(data))
行は行のリストになりますので、行の長さは行数に過ぎません。次のステップのデータにはファイルの内容の文字列が含まれます(各単語は空白で区切られています)。したがって、そのリストの長さは単語数を示します。単語リストに参加すると、すべての文字が単一の文字列として取得されます。したがって、その長さは文字数を与えます。
入力をファイル名、つまりfiles.txtから入力パラメーターから取得し、ファイル内の文字の総数をカウントして変数に保存します- char
fname = input("Enter the name of the file:")
infile = open(fname, 'r') # connection of the file
lines = 0
words = 0
char = 0 # init as zero integer
for line in infile:
wordslist = line.split() # splitting line to Word
lines = lines + 1 # counter up the Word
words = words + len(wordslist) # splitting Word to charac
char = char + len(line) # counter up the character
print("lines are: " + str(lines))
print("words are: " + str(words))
print("chars are: " + str(char)) # printing beautify
num_lines = sum(1 for line in open('filename.txt'))
num_words = sum(1 for Word in open('filename.txt').read().split())
num_chars = sum(len(Word) for Word in open('filename.txt').read().split())