私は PostgreSQL データベースに解析している csv ファイルのフォルダーを持っています。大部分は比較的簡単ですが、値の 1 つは文字列として返されますが、実際には次のような辞書のリストです。
EDIT:これは読み取られる値の構造であり、可変量のエントリがあるか、まったくない場合もあります。これは、行の値として、csv リーダー オブジェクトによって読み取られる文字列です。
[{"Comment":"natural text here1", "Added By":"user1", "Made On":"Timestamp1"},
{"Comment":"natural text here2", "Added By":"user2", "Made On":"Timestamp2"},
{"Comment":"natural text here3", "Added By":"user3", "Made On":"Timestamp3"}]
これは有効な json オブジェクトではないため、json.loads() できません。私もそれをjson文字列にしてみました
json_obj = '{\"%s\": %s}' % (columns[j], item)
私に与える為に:
{
"Comments" : [
{"Comment":"natural text here1", "Added By":"user1", "Made On":"Timestamp1"},
{"Comment":"natural text here2", "Added By":"user2", "Made On":"Timestamp2"},
{"Comment":"natural text here3", "Added By":"user3", "Made On":"Timestamp3"}
]
}
これは有効な json オブジェクトですが、json.loads は依然として ValueError をスローします。
私はこれらの行に沿って何かをしています:
dir = 'file\\path'
files = os.listdir(dir)
for file in files:
i = 0
columns = []
path = os.path.join(dir, file)
with open(path, mode='rb') as csvfile:
reader = csv.reader(csvfile, encoding = 'utf-8', errors = 'ignore',
delimiter = ',', quotechar = '"')
for row in reader:
j = 0
dictionary = dict()
if i == 0:
columns = row
i += 1
else:
for item in row:
if columns[j] == "the column in question"
#-------------------------------
#trying to parse out this value
#--------------------------------
else:
dictionary[columns[j]] = item
j += 1
基本的に、これによりcsvファイルの各行の辞書が残り、データベースにプッシュされます。私はそれがよりきれいになると確信していますが、その1つの完成したコードです。私が抱えている問題は、実際にはリストである文字列値を処理する方法です。私が見落としているこれを処理する簡単な方法があると確信しています。
私の最初の考えは、値を空のリストに入れることでした(反復可能な辞書のリストが得られるという仮定の下で)。しかし、それは文字列内の文字のリストを与えるだけです。
自然なテキスト フィールドには句読点があるため、文字列をカンマで分割することもできません。
何かご意見は?