MikiTech

文系新卒エンジニアの学習記録

【基本情報】平成30年秋期 問20

はじめに

メモ代わりでもあります。

問題

リンカの機能として,適切なものはどれか。

ア:作成したプログラムをライブラリに登録する。
イ:実行に先立ってロードモジュールを主記憶にロードする。
ウ:相互参照の解決などを行い,複数の目的モジュールなどから一つのロードモジュールを生成する。
エ:プログラムの実行を監視し,ステップごとに実行結果を記録する。
続きを読む

【Python】JSONを開く際に、「UnicodeDecodeError: 'cp932' codec can't decode byte 0x85〜」 が出た時の処理について

起こったこと

Pythonが楽しくて、アウトプットとして自然言語処理100本ノックをやっていたとき。
Macで叩いたソースコードGitHubに上げて、Windowsを触っていたときにgit cloneして動かそうと思ったのですが、
jsonファイルをただ読み込もうとした際に下記のようなエラーが発生しました。

    for line in f:
UnicodeDecodeError: 'cp932' codec can't decode byte 0x85(以下略)

????

環境

Macbook Python 3.8.0

Windows 10 Python 3.8.5

ソースコード

# coding: utf-8
import gzip
import json
#正規表現使うためのライブラリ
import re

def search_UK():
    with gzip.open('chart3/jawiki-country.json.gz',mode='rt') as f:
        for line in f:
            json_load = json.loads(line)
            if json_load['title'] == 'イギリス':
                return json_load['text']


#findall(pattern, string)  正規表現にマッチする部分文字列を全て探しだしリストとして返します。
result = re.findall(r'^(.*\[\[Category:.*\]\].*)$',search_UK(),re.MULTILINE)

for line in result:
    print(line)

調べたところ…

どうやらWindows環境では、デフォルトで文字のコーディングがcp932になるようです。
Pythonでは文字のエンコードを指定する際に、

# coding: utf-8

と書けばよく、Macではそのまま動いたのですが、Windowsではそうもいかなかったようです。

解決方法

jsonファイルを開いたあとの、for文でエラーが発生していたため

 with gzip.open('chart3/jawiki-country.json.gz',mode='rt',encoding = 'utf-8') as f:

開く段階で、utf-8にするように修正しました。
すると無事動きました!!!

おわりに

大抵、こういった文字コードや環境構築で躓いちゃいますよね。。。。

【Python】言語処理100本ノック2020 09. Typoglycemia

問題

nlp100.github.io

スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ.ただし,長さが4以下の単語は並び替えないこととする.適当な英語の文(例えば”I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind .”)を与え,その実行結果を確認せよ.

続きを読む

【Python】言語処理100本ノック2020 08. 暗号文

問題

nlp100.github.io

与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ. 英小文字ならば(219 - 文字コード)の文字に置換 その他の文字はそのまま出力 この関数を用い,英語のメッセージを暗号化・復号化せよ.

環境

Macbook Pro
Python3.7.7

コード

def cipher(sentense):
   secretList = list()

   for word in sentense:
        if word.islower():
           secretList.append(chr(219 - ord(word)))
        else:
           secretList.append(word)

   return  "".join(secretList)



sentense = input("英語で文章を入力してください >>")
print(cipher(sentense))

'''
<出力イメージ>
英語で文章を入力してください >>I live in Tokyo
I orev rm Tlpbl
'''

説明-文字コードについて

今回キーとなるワードは「文字コード」。
Python文字コードを得るには、ordが使えるようで、文字コードから文字に直すにはchrが使えるようです。

python.civic-apps.com

環境がPython3とPython2では微妙に書き方が違うので注意。
また、この際得られる文字コードASCIIです。

説明-関数の処理について

お題の通り、cipherという関数を定義します。
まずリストを作成します。 ちょうどこの部分ですね。

def cipher(sentense):
   secretList = list()

pycarnival.com

引数にコマンドライン入力された文字列を受け取っており、
その文字列をfor文で単語を取り出すという作業をしております。

問題なのが「小文字」の判定。 ですがPythonには簡単に文字列を大文字小文字に変換したり、判定するメソッドが備わっています。

note.nkmk.me

print('TOKYO.isupper())
# True

といった感じです。 これを応用して、あとは問題の通り、「英小文字ならば(219 - 文字コード)の文字に置換」するだけになります。

   for word in sentense:
        if word.islower():
           secretList.append(chr(219 - ord(word)))
        else:
           secretList.append(word)

小文字以外であれば、そのまま単語をリストに加えるだけです。

return  "".join(secretList)

あとはjoinで文字列のリストを連結すれば完成です!

note.nkmk.me

もっと他にいい書き方があれば、ぜひ教えて下さい!!

【Python】言語処理100本ノック2020 07. テンプレートによる文生成

問題

nlp100.github.io

引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ.さらに,x=12, y=”気温”, z=22.4として,実行結果を確認せよ.

コード

#書き方1
def sendText(x,y,z):
    print(str(x) + "時の" + y +  "は" + str(z))

sendText(12,"気温",22.4)

#書き方2
def getText(x,y,z):
    return f'{x}時の{y}は{z}'

print(getText(12,"気温",22.4))

最初書き方1の方で書いていました。
色々調べるとJavaのformatメソッドのように、PythonにもFormatメソッドあって、

note.nkmk.me

こちらを利用して書いたのが書き方2です。

このくらいです…。 以上【Python】言語処理100本ノック2020 07. テンプレートによる文生成でした。 もっと良いコードがあれば教えて下さいm( )m