1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

リンク切れのレコードを判別して削除する[Python, Access]

Last updated at Posted at 2023-10-08

背景

アホが書いた記事なのに下記の記事のviewが10000超えてて驚愕しました。
非常に励みになります。

もう少しちゃんとしたいと思い、ファイル名やパスが変わってリンク切れになった場合の対処も書いときます。

おさらい

Accessで、こんなテーブルのPath列にPowerpointファイルのファイルパスが入っています。
image.png

方針

・リンク先のファイルがあるか確認
・なかったら消す
の処理を行うpyodbcを使ったコード

コード

import os
import pyodbc

#データベース接続
conn_str= (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=C:\Database.accdb;'#Accessファイルのパス
    )
conn=pyodbc.connect(conn_str)
cursor=conn.cursor()

#全レコードの取得
sql_select="SELECT [Path] FROM [テーブル1]"
cursor.execute(sql_select)
path_list=[item[0] for item in cursor.fetchall()]
path_list=list(set(path_list)) 

#リンク切れのファイルのレコードを削除
for fpath in path_list:
    path_for_sql=fpath.replace(r"'",r"''") #シングルクォートのエスケープ
    if not os.path.exists(fpath):
        cursor.execute(r"DELETE FROM [テーブル1] WHERE [Path] = '" + path_for_sql + "'")
        print (fpath + "はリンク切れのため削除")

cursor.commit()

cursor.close()
conn.close()

cursor.executeからのfetchallを使った全レコードリスト取得は汎用性ありそうですね。(自分用メモ)

動作確認

実行前 リンク切れのレコードをわざと追加してあります
image.png

実行画面
image.png

実行後 レコードが消されてますね。OK
image.png

注意

ネットワーク上のPowerpointファイルのパスについては、LANの問題とかでファイルサーバーへのアクセスができない場合もリンク切れと判定されてレコードが消されるかもしれない。
そこで実行前にファイルへのアクセスが可能か確かめ、念のためバックアップ(Accessファイルのコピー)もとっておく。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?