0

背景: Python スクリプトを使用して、Web サイトからデータ (html) をスクレイピングし、このデータを CSV ドキュメントに入れます。

この CSV ドキュメントは次のようになります。

Hong Kong;The Jardine Engineering Corporation Limited
Hong Kong;Towngas
Hong Kong;Tricor Services Limited
Hong Kong;UL International Limitied
Hong Kong;Urban Property Management Limited
Hong Kong;VTECH Corporate Services Ltd.
Vietnam;Cam Ranh Computer Co. Ltd
Vietnam;CFTP Company
Vietnam;Chevron Vietnam

最初の列: 国

2列目:名前

私のファイルには 5000 行以上あります。

この CSV ドキュメントを別の CSV ドキュメント (同じスクリプトの同じ構造) と比較して、潜在的な変更を追跡する必要があります (新しい行がある場合、または行が削除された場合)。 最善の方法は、すべての変更を含むファイルを作成するか、ターミナルで印刷することです。

* CSV ファイルで何かが変更された場合 (もう 1 行)、すべてのデータがシフトされることに注意してください *

4

3 に答える 3

1

GNUdiffを使用します。これは、まさに必要なことを実行するように設計されたコマンドライン ツールです。GUI バージョンが利用可能です。

ウィキペディアから:

コンピューティングでdiffは、2 つのファイルの違いを出力するファイル比較ユーティリティです。通常、ファイルのあるバージョンと同じファイルの以前のバージョンとの間の変更を表示するために使用されます。Diff は、テキスト ファイルの行ごとの変更を表示します。最新の実装では、バイナリ ファイルもサポートされています。[1] 出力は Unix プログラム パッチで適用できるため、出力は「diff」またはパッチと呼ばれます。同様のファイル比較ユーティリティの出力は、「差分」とも呼ばれます。検索行為を説明するための単語「grep」の使用のように、単語 diff は専門用語で違いを計算するための動詞として使用されます。[要出典]

疑念の恩恵を与えるために、おそらく「Python から 2 つの csv ファイルの違いを見つける」のようなものを Google で検索しようとしました。ファイルがcsvフォーマットであるという事実、または Python を使用して作成されたという事実を忘れた場合、検索するfind differences between text filesと GNU が見つかりdiffます。


編集:

GNU では、1 行追加しても問題ありませんdiff。変更された 1 行を検出し、それについて通知します。

例:

lws@helios:~$ cat file1
alpha
beta
charlie
delta
echo
foxtrot

lws@helios:~$ cat file2
alpha
beta
charlie
CHAMELEON
delta
echo
foxtrot

lws@helios:~$ diff file1 file2
3a4
> CHAMELEON
于 2012-04-10T11:20:55.663 に答える
1

スタックオーバーフローへようこそ。:)

あなたの問題は、2 つのリスト間の差分を取ることに要約されます。これはdifflibを介して Python で利用できます。

マニュアルのこの例は、次のことに役立ちます。

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
...              'ore\ntree\nemu\n'.splitlines(1))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print ''.join(restore(diff, 1)),
one
two
three
>>> print ''.join(restore(diff, 2)),
ore
tree
emu

変更をファイルに出力するには:

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> for line in unified_diff(s1, s2, fromfile='before.py', tofile='after.py'):
...     sys.stdout.write(line)   
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido
于 2012-04-10T11:28:42.143 に答える
0
OLD_PATH = r'/Users/abelrossignol/Desktop/1.csv'
NEW_PATH = r'/Users/abelrossignol/Desktop/2.csv'

out = open("Out.txt", 'w')

old = open(OLD_PATH, 'r')
old_lines = list(old)
old.close()

new = open(NEW_PATH, 'r')
new_lines = list(new)
new.close()

for line in unified_diff(old_lines, new_lines, fromfile=OLD_PATH, tofile=NEW_PATH):
    out.write(line)
    print("Writter")

完全に機能しているようです。私はまだ Out.txt の構造を理解しようとしていますが、最も困難な作業は完了しています。

ご助力ありがとうございます ;-)

いつか他の人に役立つことを願っています。

于 2012-04-11T02:02:30.913 に答える