4

私はpythonが初めてで、質問があります。
同様の質問をチェックし、チュートリアルのダイブをpythonでチェックし、pythonのドキュメント、googlebinging、同様のスタックオーバーフローの質問、およびその他の多数のチュートリアルをチェックしました。
20 個のツイートを含むテキスト ファイルを読み取る Python コードのセクションがあります。次のコードを使用して、これらの 20 個のツイートを抽出できます。

with open ('output.txt') as fp:
    for line in iter(fp.readline,''):   
        Tweets=json.loads(line)             
        data.append(Tweets.get('text'))
    i=0
    while i < len(data):                         
        print data[i] 
        i=i+1 

上記の while ループは完全に繰り返され、 からの 20 個のツイート (行) を出力しoutput.txtます。ただし、これらの 20 行には、 のような非英語文字データ、 のような"Los ladillo a los dos, soy maaaala o maloooooooooooo"URL "http://t.co/57LdpK"、文字列"None"、および URL を含む写真が含まれています"Photo: http://t.co/kxpaaaaa(プライバシーのために編集しました)。

listこれの出力 (これは) をパージし、以下を除外したいと思います。

  1. Noneエントリ_
  2. 文字列で始まるもの"Photo:"
  3. 非Unicodeデータを除外できれば、それもおまけです

次のコードを試しました

  1. 使用してdata.remove("None:")いますが、エラーが発生しますlist.remove(x): x not in list.
  2. セットに入れたくないアイテムを読み込んでから、出力を比較しますが、うまくいきません。
  3. リスト内包表記を研究していますが、ここで正しい解決策を見ているのだろうか。

私は、出力の必要な/不要なセクションを切り取る機能があるOracleのバックグラウンドから来たので、これについて過去2時間で本当にぐるぐる回っていました。どんな助けでも大歓迎です!

4

5 に答える 5

2

まず、テキスト エントリTweet.get('text')ある場合にのみ追加します。

with open ('output.txt') as fp:
    for line in iter(fp.readline,''):   
        Tweets=json.loads(line)
        if 'text' in Tweets:
            data.append(Tweets['text'])

Noneそれはエントリを追加しません(キーが辞書に存在しない場合は.get()戻ります)。None'text'

dataここでは、ここで作成しているリストをさらに処理したいと考えています。そうでないfor entry in data:場合は、以下のループを省略して、ifステートメントを含む 1 つのループに固執することができます。はループTweets['text']と同じ値です。entryfor entry in data

次に、Pythonのunicode値をループしているので、これらのオブジェクトで提供されているメソッドを使用して、不要なものを除外します。

for entry in data:
    if not entry.startswith("Photo:"):
        print entry

ここでリスト内包表記を使用できます。以下は、すべてのエントリも一度に出力します。

print '\n'.join([entry for entry in data if not entry.startswith("Photo:")])

この場合、それを印刷するためだけに 1 つの大きな文字列を構築しているため、実際にはそれほど多くはありません。個々の文字列を印刷して、文字列の構築コストを回避することもできます。

すべてのデータが Unicode データであることに注意してください。おそらく、 ASCIIポイントを超えるコードポイントを使用するテキストを除外することを望んでいたのでしょう。正規表現を使用して、テキストに ASCII を超えるコードポイントがあることを検出できます

import re
nonascii = re.compile(ur'[^\x00-0x7f]', re.UNICODE)  # all codepoints beyond 0x7F are non-ascii

for entry in data:
    if entry.startswith("Photo:") or nonascii.search(entry):
        continue  # skip the rest of this iteration, continue to the next
    print entry

非 ASCII 式の短いデモ:

>>> import re
>>> nonascii = re.compile(ur'[^\x00-\x7f]', re.UNICODE)
>>> nonascii.search(u'All you see is ASCII')
>>> nonascii.search(u'All you see is ASCII plus a little more unicode, like the EM DASH codepoint: \u2014')
<_sre.SRE_Match object at 0x1086275e0>
于 2013-05-14T16:30:17.613 に答える
1

次のようなものをお勧めします。

# use itertools.ifilter to remove items from a list according to a function
from itertools import ifilter
import re

# write a function to filter out entries you don't want
def my_filter(value):
    if not value or value.startswith('Photo:'):
        return False

    # exclude unwanted chars
    if re.match('[^\x00-\x7F]', value):
        return False

    return True

# Reading the data can be simplified with a list comprehension
with open('output.txt') as fp:
    data = [json.loads(line).get('text') for line in fp]

# do the filtering
data = list(ifilter(my_filter, data))

# print the output
for line in data:
    print line

ユニコードに関しては、python 2.x を使用していると仮定すると、open関数はデータをユニコードとして読み取るのではなく、型として読み取られますstr。エンコーディングがわかっている場合は変換するか、 を使用して特定のエンコーディングでファイルを読み取ることができますcodecs.open

于 2013-05-14T16:53:29.643 に答える