web-dev-qa-db-ja.com

Pythonを使用してファイル内の文字数を検索します

ここに質問があります:

これらの単語を含むファイルがあります。

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です。可能であれば、スペースなしの文字数を見つけたいです。たとえ誰かがスペースのある文字数のループを知っていても大丈夫です。

20
S.Soopra

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:

インデントを離れるとすぐに閉じることを約束してファイルを開きます。ファイルを使い終わったら、ファイルを閉じることをお勧めします。

20
Mike Müller

各行(最後の行を除く)には行区切り記号があることに注意してください。つまり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)
9
Solo

これはコメントするには長すぎます。

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 =。

8
Jared Smith

私はこの解決策を非常に簡単で読みやすいと見つけました:

with open("filename", 'r') as file:
    text = file.read().strip().split()
    len_chars = sum(len(Word) for Word in text)
    print(len_chars)
8
barrios

文字を数えるには、個々のWordを数える必要があります。したがって、文字をカウントする別のループを作成できます。

_for Word in wordslist:
    characters += len(Word)
_

それはそれを行うべきです。単語リストは、おそらく右側の改行文字を削除する必要があります。おそらくwordslist = line.rstrip().split()のようなものです。

8
csl

どうですか?正規表現を使用して、すべての非空白文字に一致し、文字列内の一致数を返します。

import re

DATA="""
hey how are you
I am fine and you
Yes I am fine
"""

def get_char_count(s):
    return len(re.findall(r'\S', s))

if __name__ == '__main__':
    print(get_char_count(DATA))

出力

35

以下の画像は、RegExrでテストされたこれを示しています。

Regex Test

6
Tagc

おそらく改行文字をカウントしています。 (lines + 1)で文字を引く

5
Loaf

コードは次のとおりです。

fp = open(fname, 'r+').read()
chars = fp.decode('utf8')
print len(chars)

出力を確認してください。私はそれをテストしました。

5
Rahul

他の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()が行うことを手動で行うことです。車輪を再発明する理由はありません。

5
Mego

あなたは正しい答えを持っています-あなたのコードは完全に正しいです。私がやっていると思うことは、通過する行末文字があり、それにはあなたの文字カウントが2つ含まれていることです(移動する新しい行がないので、最後の行に1つはありません)。これを削除したい場合、単純なファッジは、ローフが示唆したようにすることです

characters = characters - (lines - 1)

2番目の部分についてはcslの回答を参照してください...

4
A. N. Other

2つの問題があります。 1つは行末で、もう1つはその間のスペースです。

今ではかなり良い回答を投稿した人がたくさんいますが、この方法は理解しやすいと思います。

characters = characters + len(line.strip()) - line.strip().count(' ')

line.strip()は、末尾と先頭のスペースを削除します。次に、合計の長さからスペースの数を引いています。

4
Jimmar

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)
4
Nizam Mohamed

とても簡単です:

f = open('file.txt', 'rb')
f.seek(0) # Move to the start of file
print len(f.read()) 
0
A.Gorbunoff

ここでは、問題のメモリ使用量が少ない最小のプログラムを取得しました

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))

行は行のリストになりますので、行の長さは行数に過ぎません。次のステップのデータにはファイルの内容の文字列が含まれます(各単語は空白で区切られています)。したがって、そのリストの長さは単語数を示します。単語リストに参加すると、すべての文字が単一の文字列として取得されます。したがって、その長さは文字数を与えます。

0
manik venkat

入力をファイル名、つまり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
0
Hiren More
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())
0
Gagana