@M4A1silencer

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonのリストの扱い方について

Q&A

Closed

解決したいこと

pythonのリストの扱い方について

複数のExcelファイルのディレクトリのリストAがあり、
そのリストからExcelファイルを読みだして、一つ一つ
処理を行うのですが、一度読み込んだExcelファイルは
再度読み込みを行いたくないので、読み込んだディレクトリを
csvのリストBとして保存して、Excelファイルを読み込むプログラムを
実行する際はcsvのリスト(listB)を始めに読み込んで、読み込みの重複しない
仕様にしたいのですが、プログラムを走らせた後のcsvのlistBが
下記のようになってしまい思ったような動きをしませんでしたので、
ご教授願いたいです。

listAの中身が下記のように設定しています。

['C://Users//abc//Desktop//ABCフォルダ\\abc\\311216.xls',
 'C://Users//abc//Desktop//ABCフォルダ\\abc\\311217.xls',
 'C://Users//abc//Desktop//ABCフォルダ\\abc\\311218.xls']

csvから一度読み込んだlistBのデータを読み込んで、リストに落とし込んだ後
処理を実行し、listAをHensuuに格納して処理を実行。
Hensuuをlist_Sumiに追加するプログラムにしました。

with open("C://Users//abc//Documents//listB.csv") as listB:
    Sumi_reader = reader(listB)
    list_Sumi = list(Sumi_reader)
    for Hensuu in listA :
        if Hensuu not in list_Sumi:
            #処理
            list_Sumi.extend(Hensuu)

プログラムを実行した後の
list_Sumiを確認したところ''で1文字ずつ区切られてしまっていました。

### 発生している問題
[[],
 'C',
 ':',
 '/',
 '/',
 'U',
 's',
 'e',
 'r',
 's',
 '/',
 '/',
 'a',
 'b',
 'c',
 '/',
 'D',
 'e',
 's',
 'k',
 ...]

また、プログラム実行後のlistB.csvが更新されていませんでした。
with openを用いれば、閉じる際に自動的に保存されると記事に
載っていたのですが、リストにしてしまうと自動で保存は無理でしょうか?

質問1
listAの形式でリストに追加する方法はありますか?
1文字ずつ区切られないようにしたいです。
質問2
追加したlistBのcsvファイルの更新方法教えてください。

宜しくお願いいたします。

0 likes

3Answer

質問1
listAの形式でリストに追加する方法はありますか?

以下実行してみたら、分かるんじゃないでしょうか?

文字列
name='C://Users//abc//Desktop//ABCフォルダ\\abc\\311216.xls'
names = [ name, name]
names.append(name)

for value in name:
    print(value)
    
for value in names:
    print(value)

質問2

書き出すことが出来たのであれば、そこに追記するだけなのでそれほど難しくないのではないかなぁと。
最悪、ファイル消して、新規で作るって道もありますけど・・

元の記事に書いてあったのであれば、元の記事を再度確認して自身の実装との差異を検討してみるのが手っ取り早いのではないかなと

難しいようであれば、処理時間を記録して、それ以前のは処理しない、とかにするとか。

1Like

Comments

  1. @M4A1silencer

    Questioner

    教えて頂きありがとうございます。
    extendではなくappendでも追加できることを初めて知りました。

質問1について、import csvをして、csv.reader()で読み込んでいますでしょうか。
例えば、test.csvの中身を以下のようにします。

test.csvの中身
1,2,3
4,5,6
7,8,9

そして、

with open('tes.csv') as f:
    reader = f.read()
    reader = list(reader)
    print(reader)

と実行すると、

['1', ',', '2', ',', '3', '\n', '4', ',', '5', ',', '6', '\n', '7', ',', '8', ',', '9']

と実行されます。
また、、import csvをして、csv.reader()でいる場合、デフォルトではcsvファイルの区切り文字がカンマになっています。区切り文字が異なる場合は変えると動くかも知れません。

質問2について、ファイルにはオプションがあり、"r"で読み込み、"w"で書き出しができます。
こんな感じでどうでしょうか。

ファイルの読み書き
import csv


with open("C://Users//abc//Documents//listB.csv", "r") as listB:
    Sumi_reader = csv.reader(listB)
    list_Sumi = list(Sumi_reader)
    for Hensuu in listA:
        if Hensuu not in list_Sumi:
            #処理
            list_Sumi.extend(Hensuu)
# ファイルに書き出し
with open("C://Users//abc//Documents//listB.csv", "w") as f:
    for line in list_Sumi:
        f.write(','.join(line))
        f.write('\n')
1Like

list_Sumi.extend(Hensuu)


extend ではなく append にすればいいですよ。

```py
list_Sumi.append(Hensuu)
>>> data = []
>>> data.extend("abc")
>>> data
['a', 'b', 'c']
>>> data = []
>>> data.append("abc")
>>> data
['abc']

listB.csv が 1行だけのCSVファイルでいいなら、以下のような処理になるかと思います。

import csv

listA = [
    'C:/Users/abc/Desktop/ABCフォルダ/abc/311216.xls',
    'C:/Users/abc/Desktop/ABCフォルダ/abc/311217.xls',
    'C:/Users/abc/Desktop/ABCフォルダ/abc/311218.xls',
]

try:
    with open("C:/Users/abc/Documents/listB.csv") as f:
        listB = list(csv.reader(f))[0]  # 1行目だけ取得
except (FileNotFoundError, IndexError):
    listB = []  # ファイルがなかったり1行目がない場合

# listA のうち、listB にないもの
list_Sumi = [sumi for sumi in listA if sumi not in listB]

print('listA:', listA)
print('listB:', listB)
print('listSumi:', list_Sumi)

# listB と list_Sumi を保存
with open("C:/Users/abc/Documents/listB.csv", "w") as f:
    csv.writer(f).writerow(listB + list_Sumi)

print('save:', listB + list_Sumi)
1Like

Comments

  1. @M4A1silencer

    Questioner

    @shiracamus さんありがとうございます。
    無事、リストの更新がきでるようになりました。
    とてもいい勉強になりました。

Your answer might help someone💌