2020-01-26に更新

ぴょろろっぽ☆(^~^)

ぴょろ~☆ 公開下書き

2020-01-26 12:00 -

File1 File2
----- -----
abc   abc
def
ghi   def
      abc

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑2つのファイルを見比べて、含まれていない情報を 抽出するアプリが欲しい☆ 行単位でいい☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 Set で行けるんじゃないか☆?」

Set1  Set2 
----- -----
abc   abc
def
ghi   def

KIFUWARABE_80x100x8_01_Futu.gif
「 ↑Set で同じファイル内の重複行は消えるから……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 ↑Set2 を正とするなら、Set2 を foreach で回して、Set1 の要素をリムーブしろだぜ☆」

Set1  Set2 
----- -----
      abc

ghi   def

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 Python で作んの? C# で作んの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 GUIが要らないなら Python でいいだろ……☆」

diff1-100/ex1/diff.py

print("Hello!")

Output:

Hello!

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 多言語やってると 文法を覚えてないよな☆」

Python: コマンドライン引数とは?(超基礎)
【Python入門】foreachをPythonで使ってみよう

import sys

args = sys.argv

print("Say,     {}!".format(len(args)))
for arg in args:
    print("Hello,   {}!".format(args))

Output:

Say,     1!
Hello,   ['c:\\Users\\むずでょ\\OneDrive\\ドキュメント\\practice-py\\diff1-100\\ex1\\diff1.py']!

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Visual Studio Code で コマンドライン引数を渡すには どうやればいいんだぜ☆?」

VSCodeでデバッガに引数を渡す方法(Python)

20200126blog7a1b1.png

Output:

Say,     4!
Hello,   ['c:\\Users\\むずでょ\\OneDrive\\ドキュメント\\practice-py\\diff1-100\\ex1\\diff1.py', 'apple', 'banana', 'cherry']!
Hello,   ['c:\\Users\\むずでょ\\OneDrive\\ドキュメント\\practice-py\\diff1-100\\ex1\\diff1.py', 'apple', 'banana', 'cherry']!
Hello,   ['c:\\Users\\むずでょ\\OneDrive\\ドキュメント\\practice-py\\diff1-100\\ex1\\diff1.py', 'apple', 'banana', 'cherry']!
Hello,   ['c:\\Users\\むずでょ\\OneDrive\\ドキュメント\\practice-py\\diff1-100\\ex1\\diff1.py', 'apple', 'banana', 'cherry']!

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 よくある間違いだぜ☆」

import sys

args = sys.argv

print("Say,     {}!".format(len(args)))
for arg in args:
    print("Hello,   {}!".format(arg)) # args --> arg

Output:

Say,     4!
Hello,   c:\Users\むずでょ\OneDrive\ドキュメント\practice-py\diff1-100\ex1\diff1.py!
Hello,   apple!
Hello,   banana!
Hello,   cherry!

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これで コマンドライン引数で ファイルパスを渡せるな☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 次に 比較対象になる2つのファイルを作るぜ☆」

deff1-100/ex2/sample1.txt:

Ant
Bird
Dog
Eagle

deff1-100/ex2/sample2.txt:

Ant
Bird
Cat
Dog
Eagle

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ とりあえず Cat があるかないかで☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 次に ファイル読取を調べるぜ☆」

【Python】ファイルの読み込み

diff1-100/ex2/dff.py:

"""
Command line arguments:
            "args": [
                "C:/Users/むずでょ/OneDrive/ドキュメント/practice-py/diff1-100/ex2/sample1.txt",
                "C:/Users/むずでょ/OneDrive/ドキュメント/practice-py/diff1-100/ex2/sample2.txt"
            ]
"""

import sys

args = sys.argv

# ファイル読取
file1 = open(args[1], "r")
file2 = open(args[2], "r")

# 行ごとにします
lines1 = file1.readlines()
lines2 = file2.readlines()

# 一行ずつ表示します
for line1 in lines1:
    print(line1)

for line2 in lines2:
    print(line2)

# ファイルをクローズします
file1.close()
file2.close()

Output:

Ant

Bird

Dog

Eagle

Ant

Bird

Cat

Dog

Eagle

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 なんだこの1つ余分な改行は?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 改行コードを可視化してみましょう!」

20200126blog8.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ べつに……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 プログラム実行中のメモリ上を調べなければ 意味なくないか☆?」

Pythonのreadline()は改行コードも含まれてしまう

import os

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ファイルの冒頭で os モジュールをインポートして……☆」

    line1 = line1.rstrip(os.linesep)

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ そのOSの改行コードを右端から削除すればいいらしい☆」

Output:

Ant
Bird
Dog
Eagle
Ant
Bird
Cat
Dog
Eagle

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ よし、ファイル読取もいけそうだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 次は 表示の代わりに Set に入れましょう!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Python でカレントディレクトリの移動って どうやるんだぜ☆?」

Pythonでカレントディレクトリを取得、変更(移動)

import os

print("Info    | Current directory: {}".format(os.getcwd()))

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 とりあえず カレントディレクトリ を表示して……☆」

os.chdir(os.path.dirname(os.path.abspath(__file__)))
print("Info    | Current directory: {}".format(os.getcwd()))

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 このファイルが置いてあるディレクトリーを カレント にするように変更しようぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 ワーキング ディレクトリを別に作って、そこをカレント・ディレクトリにすればいいのに……☆
サンプル・プログラム番号ごとに カレント・ディレクトリを移動するということは
コピーするファイルが増えるだろうに……☆」

"""
Command line arguments:
            "args": [
                "./sample1.txt",
                "./sample2.txt"
            ]
"""

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 相対パスが使えれば、サンプル・プログラムごとにディレクトリ名を変えなくていいぜ☆」

# セット作成
set1 = set()
set2 = set()

# 一行ずつセットに追加
for line1 in lines1:
    line1 = line1.rstrip(os.linesep)
    set1.add(line1)

for line2 in lines2:
    line2 = line2.rstrip(os.linesep)
    set2.add(line2)

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ セットに追加してみようぜ☆」

# 一要素ずつ表示します
for element1 in set1:
    element1 = element1.rstrip(os.linesep)
    print("Set1: {}".format(element1))

for element2 in set2:
    element2 = element2.rstrip(os.linesep)
    print("Set2: {}".format(element2))

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 表示はこんなもんでいいのだろうか☆?」

Output:

Set1: Eagle
Set1: Ant
Set1: Bird
Set1: Dog
Set2: Ant
Set2: Eagle
Set2: Bird
Set2: Dog
Set2: Cat

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ いけてそうだな☆ セットは順序を覚えていないのでこれでいいぜ☆」

diff1-100/ex4/diff.py:

"""
Command line arguments:
            "args": [
                "./sample1.txt",
                "./sample2.txt"
            ]
"""

import sys
import os

print("Info    | Current directory: {}".format(os.getcwd()))

os.chdir(os.path.dirname(os.path.abspath(__file__)))
print("Info    | Current directory: {}".format(os.getcwd()))

args = sys.argv

# ファイル読取
file1 = open(args[1], "r")
file2 = open(args[2], "r")

# 行ごとにします
lines1 = file1.readlines()
lines2 = file2.readlines()

# セット作成
set1 = set()
set2 = set()

# 一行ずつセットに追加
for line1 in lines1:
    line1 = line1.rstrip(os.linesep)
    set1.add(line1)

for line2 in lines2:
    line2 = line2.rstrip(os.linesep)
    set2.add(line2)

# サンプル2を正として、サンプル1の要素を削除します
for element2 in set2:
    element2 = element2.rstrip(os.linesep)
    set1.discard(element2)

print("Info    | Difference below...")

# 一要素ずつ表示します
for element1 in set1:
    element1 = element1.rstrip(os.linesep)
    print("Info    | {}".format(element1))

print("Info    | Difference above...")

# ファイルをクローズします
file1.close()
file2.close()

Output:

Info    | Current directory: C:\Users\むずでょ\OneDrive\ドキュメント\practice-py
Info    | Current directory: c:\Users\むずでょ\OneDrive\ドキュメント\practice-py\diff1-100\ex4
Info    | Difference below...
Info    | Difference above...

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ファイル2を正にすれば、ファイル1は全消しになるのは合ってるな☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 次は逆にしてみようぜ☆?」

Info    | Current directory: C:\Users\むずでょ\OneDrive\ドキュメント\practice-py
Info    | Current directory: c:\Users\むずでょ\OneDrive\ドキュメント\practice-py\diff1-100\ex4
Info    | Difference below...
Info    | Cat
Info    | Difference above...

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 よし イケてる☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これで情報量の少ないファイルを 処分できるぜ☆」

    # 前後の空白を削除
    line1 = line1.strip()

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑しかしインデントの違いで 異なる情報と判定するのは 気が利かないな……☆ トリムするかだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 しかしお父ん、他にも CSV形式と RTF形式で データを持っているぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 RTF☆!? わらう☆」

Is there a Python module for converting RTF to plain text? [closed]

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 RTF形式ファイルは駆逐しようぜ☆? パーサーはあるようだが……☆」

gilsondev/extract_rtf.py

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 RTF形式ファイルは テキストファイルなんで、他人の作った ↑スクリプト で
スタイルを全部除去して プレーンテキストに変換しようぜ☆?」

'str' object has no attribute 'decode'

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Python2 で書かれていて、 Python3 で動かね……☆ 修正するか……☆」

Before:

for match in pattern.finditer(text.decode()):

After

for match in pattern.finditer(text.replace(r'\_', '\u2010')):

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 手元のコードを修正した☆」

print("Info    | Current directory: {}".format(os.getcwd()))

os.chdir(os.path.dirname(os.path.abspath(__file__)))
print("Info    | Current directory: {}".format(os.getcwd()))

args = sys.argv

# ファイル読取
file1 = open(args[1], "r")
file2 = open(args[2], "w")

# すべての内容を読み込みます
rtfText1 = file1.read()

# 処理を行います
plainText1 = striprtf(rtfText1)

# 表示します
print(
    """
    Before----------------------------------------------------------------------------------------------------
    {}
    """.format(rtfText1))

print(
    """
    After----------------------------------------------------------------------------------------------------
    {}
    """.format(plainText1))

# ファイル書き出し
file2.write(plainText1)

# ファイルをクローズします
file1.close()
file2.close()

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 自分のコードはこう☆ 他人のコードを呼び出すぜ☆」

Output:

Info    | Current directory: C:\Users\むずでょ\product\repos\product-py
Info    | Current directory: c:\Users\むずでょ\product\repos\product-py\extract-rtf1-100\ex1

Before----------------------------------------------------------------------------------------------------
{\rtf1}



After----------------------------------------------------------------------------------------------------


KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こんな風に プレーンテキストに変換していってくれるので、目視確認で1ファイルずつ処分していくかだぜ☆

After----------------------------------------------------------------------------------------------------

@@©¶@Ìc[@Ì   ðµÄA
@@ðJ¢ÄÝܵå¤B

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ あっ、文字化けした☆!」

<書きかけ>

何度でもクリック!→

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ の最近の記事