У меня есть два файла CSV: file1.csv и file2.csv. Оба имеют несколько столбцов следующим образом:
а. файл1.csv
username,user id,access hash,name,group,group id
SreyTey1998,963229606,7854138709318981862,Smaradey Chan,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
Srey_Tey_1,2079816779,6921382059939144796,Srey tey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
sreytey123,5316691604,668712126044928206,Phat SreyTey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
Sreytey168,5455045488,-714912998136226691,Vong Soksreytey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
SreyTey99,5653783510,-2575791274366210473,Oun Tey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
sreytey1919,5819100400,3174041461521242292,Tey Tey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
Sreytey6666,6001252515,1586106578669001327,Srey Tey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
SreyTey7777,6026179841,5596849859821333867,Srey Tey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
Ahh_Nak86,5637888996,-1267155033181296023,Yìì Ng,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
б. файл2.csv
username,user id,access hash,name,group,group id
SreyTey1998,963229606,7854138709318981862,Smaradey Chan,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
Srey_Tey_1,2079816779,6921382059939144796,Srey tey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
sreytey123,5316691604,668712126044928206,Phat SreyTey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
Sreytey168,5455045488,-714912998136226691,Vong Soksreytey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
SreyTey99,5653783510,-2575791274366210473,Oun Tey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
sreytey1919,5819100400,3174041461521242292,Tey Tey,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
AhhLyn1213,808888756,2482753619838480608,Ly-លី🌈â¤ï¸,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
ahhly09,938983724,-8302570306911018211,方塔莉,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
ahh_vong,873218908,1743989214734522713,Mek Sreyvong,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
ahhnitaccd,5420585351,-6331445989210603589,NITA CCD,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
в. Выходной файл file2-nodups.csv должен иметь следующий вид:
username,user id,access hash,name,group,group id
AhhLyn1213,808888756,2482753619838480608,Ly-លី🌈â¤ï¸,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
ahhly09,938983724,-8302570306911018211,方塔莉,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
ahh_vong,873218908,1743989214734522713,Mek Sreyvong,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
ahhnitaccd,5420585351,-6331445989210603589,NITA CCD,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
Я пробовал следующие коды:
with open('file1.csv', 'r', encoding = "utf8") as t1:
fileone = t1.readlines()
with open('file2.csv', 'r', encoding = "utf8") as t2:
filetwo = t2.readlines()
# scans through the two files and writes differences to new csv
with open('file2-nodups.csv', 'w', encoding = "utf8") as outFile:
for line in filetwo:
if line not in fileone:
outFile.write(line)
Вышеупомянутое не работает, поскольку выходной файл (file2-nodups.csv) имеет то же содержимое, что и file2.csv.
Очень ценю любые советы.
Я хотел бы подтвердить, что приведенные выше коды работают для следующих данных:
file1.csv:
username,user id,access hash,name,group,group id
asgie2,19933,29kd982hi4hh6h443,
47uuha,491920,kdsagku5kkajgjag,
james_sing,4002899,4asg37yragdh300asgdlk,
joe_naro,4989222,hgjhe84jkaglagjj,
48700245,hlvkiiwej8njnnrk320kc,
file2.csv:
username,user id,access hash,name,group,group id
misschue,87340a,hgeikka83llagea,
james_sing,4002899,4asg37yragdh300asgdlk,
michell22,4883140,cn2ukkfhiigakgd3yhg,
Output file:
username,user id,access hash,name,group,group id
misschue,87340a,hgeikka83llagea,
michell22,4883140,cn2ukkfhiigakgd3yhg,
Но они не работают для данных с большим количеством столбцов выше. Очень ценю любые советы.
ОБНОВЛЕНИЕ: Python неправильно читает странные символы; поэтому все предложенные коды не работают. Эти символы появляются в четвертом столбце, например:
Ж‰ ឆាំងឣីុ ðŸ'—11 ""H1""",Зисий Лы ប៟‡ážŠáž»áŸ†áž“ឹងលក់រá ж ¶áž™áž€áž˜áŸ'មងáŸ
После замены их английскими цифрами или пробелами коды работают как положено.
Лучшее решение этой проблемы — сравнить один столбец (второй), который уникален для каждой строки, и, если он отличается, вывести эти строки из файла file2.csv в третий файл.
Вот мои файлы:
a. file1.csv
username,user id,access hash,name,group,group id
Manithbun,892557579,-8406919653747059917,Manith Bun.,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
,1128046905,-541590019988886083,M.r rithy phone shope ♥ï¸â™¥ï¸â™¥ï¸,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
PET_KIMHEANG,1209296259,-3836506661281845754,áž–áŸáž គឹមហ៊ាង៚,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
,1215736274,-3314364090375867636,"ម៉ាញ ឆាំងឣីុ 💗11 ""H1""",Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
,1296059051,289341865810496004,កូន ប៉ាប៉ា ក្រុមឡានបែនសំបូស្នáŸáž áŸ,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
oun_Rorng,1330317717,-1815409784220647876,Mss Rorng,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
,1373051922,4933577293541799006,Soroth Phe,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
Veasnalove9999,1721055020,-7406583441966710751,Veasna Love,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
b. file2.csv
username,user id,access hash,name,group,group id
Manithbun,892557579,-8406919653747059917,Manith Bun.,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
,1128046905,-541590019988886083,M.r rithy phone shope ♥ï¸â™¥ï¸â™¥ï¸,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
PET_KIMHEANG,1209296259,-3836506661281845754,áž–áŸáž គឹមហ៊ាង៚,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
,1215736274,-3314364090375867636,"ម៉ាញ ឆាំងឣីុ 💗11 ""H1""",Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
,1296059051,289341865810496004,កូន ប៉ាប៉ា ក្រុមឡានបែនសំបូស្នáŸáž áŸ,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
oun_Rorng,1330317717,-1815409784220647876,Mss Rorng,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
,1373051922,4933577293541799006,Soroth Phe,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
Veasnalove9999,1721055020,-7406583441966710751,Veasna Love,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
Thithseda,5185517950,-6420126539020087321,Thith Seda,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
,5708325040,7960869157828131294,Tong Meang,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
takoma_05,396559485,4653963679316835279,V P,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
c. nodups.csv (the lines in file2.csv which are not found in file1.csv)
Thithseda,5185517950,-6420126539020087321,Thith Seda,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
,5708325040,7960869157828131294,Tong Meang,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
takoma_05,396559485,4653963679316835279,V P,Zisy Ly បោះដុំនឹងលក់រាយកម្មង់ពីរោងចក្រផ្ទាល់📥លáŸážážœáŸážšáž›áž»áž™0967699965,1806798461
Я пробовал следующие коды, но в выходной файл ничего не записывается:
import csv
reader1 = csv.reader(open("file1.csv", 'r', encoding = "utf8"))
row1 = next(reader1)
reader2 = csv.reader(open("file2.csv", 'r', encoding = "utf8"))
row2 = next (reader2)
with open("nodups.csv", 'w', encoding = "utf8") as f:
for row in reader2:
if (row1[1] != row2[1]):
f.write(row)
Посоветуйте, пожалуйста, как это сделать. Очень ценю любую помощь.
Дорогой Амадан, оба файла имеют одинаковые названия: имя пользователя, идентификатор пользователя, хеш доступа, имя, группа, идентификатор группы.
Я запускаю коды еще раз, выходной файл по-прежнему имеет то же содержимое, что и file2.csv. Заранее большое спасибо за вашу помощь.
Скопируйте данные и код из вашего вопроса и запустите его. Вы увидите, что фраза «выходной файл по-прежнему имеет то же содержимое, что и file2.csv» не соответствует действительности. Затем выясните разницу между вашими фактическими данными/кодом и опубликованными вами данными/кодом.
Привет, Аманда, я сделал это. Выходной файл по-прежнему имеет то же значение, что и file2.csv.
Я также обновил данные без пробела, как вы советовали. Результат все тот же. Спасибо
['misschue,87340a,hgeikka83llagea,\n', 'michell22,4883140,cn2ukkfhiigakgd3yhg,\n']. Содержимое не такое, как file2.csv.
поэтому мне нужно добавить \n в конце строки? Кажется, это работает для предыдущих данных, но не работает для моих реальных данных, которые я вставил вместо предыдущих.
В качестве примечания: только отступ кода блокирует 4 пробела, так что мы можем вырезать/вставлять код, не возясь с ним.
Вы имеете в виду, что это неправильный отступ?
Как уже отмечалось, ваш код работает для представленных данных. Если с вашими реальными данными возникла проблема, выберите одну строку, которой не должно было быть в выходном файле, и сравните посимвольно в Python. Возможно, в одном файле используется окончание «\n», а в другом — «\r\n».
@ Мэн888 - Верно. Я отредактировал ваш вопрос так, чтобы первые два примера и код можно было скопировать/вставить без редактирования. Если вы попытаетесь скопировать/вставить свой последний пример, вы заметите, что в начале каждой строки есть 4 пробела, которые необходимо удалить.
Правильный. Я сделал для них отступы для удобства чтения. Когда они находятся в данных для Python, у них нет отступов. Спасибо
@tdelaney, я постараюсь выяснить, в чем проблема с реальными данными. Однако я скопировал и вставил данные из одного файла в файлы file1.csv и file2.csv. Спасибо






Чтобы гарантировать, что конечные пробелы или символы новой строки не мешают сравнению ваших файлов CSV, вы можете изменить свой код, чтобы удалить эти символы из каждой строки перед их сравнением. Вот обновленная версия вашего кода, включающая эту настройку:
with open('file1.csv', 'r', encoding = "utf-8") as t1:
fileone = [line.strip() for line in t1.readlines()]
with open('file2.csv', 'r', encoding = "utf-8") as t2:
filetwo = [line.strip() for line in t2.readlines()]
with open('file2-nodups.csv', 'w', encoding = "utf-8") as outFile:
for line in filetwo:
if line not in fileone:
outFile.write(line + '\n')
Этот код удаляет все начальные и конечные пробелы из каждой строки в обоих файлах перед выполнением сравнения. При записи строк, уникальных для второго файла, в выходной файл обеспечивается правильное форматирование каждой строки с символом новой строки в конце.
Я попробовал ваши коды выше, они не работают для моих обновленных фактических данных — выходной файл такой же, как file2.csv. Очень ценю вашу помощь.
можешь поделиться полными файлами? несколько образцов записей в нем
у вас есть адрес электронной почты - я могу отправить на него. По сути, они такие же, как я написал выше, за исключением того, что в них много строк, около 100 тысяч строк. Заголовки или названия точно такие же. Спасибо
Файлы CSV могут иметь небольшие различия, которые не влияют на фактические значения строки, но приводят к их неправильному сравнению. Например, можно было экранировать значение или использовать другую последовательность окончания строки. Вы можете использовать синтаксический анализатор CSV и избавиться от ошибочных пробелов в ячейках, чтобы нормализовать данные перед сравнением. Поскольку у нас нет ошибочных данных, это всего лишь предположение о проблеме.
import csv
def row_normalize(row):
return [cell.strip() for cell in row]
with open('file1.csv', 'r', newline = "", encoding = "utf8") as t1:
fileone = [row_normalize(row) for row in csv.reader(t1)]
with open('file2.csv', 'r', newline = "", encoding = "utf8") as t2:
filetwo = [row_normalize(row) for row in csv.reader(t2)]
# scans through the two files and writes differences to new csv
with open('file2-nodups.csv', 'w', newline = "", encoding = "utf8") as outFile:
outCsv = csv.writer(outFile)
for row in filetwo:
if row not in fileone:
outCsv.writerow(row)
Привет, я попробовал ваши коды выше, результат тот же — выходной файл имеет то же содержимое, что и file2.csv. Я попробую прочитать пару строк в файлах file1.csv и file2.csv, чтобы понять, чем они отличаются?
Это хорошая идея. Скопируйте два файла во временные файлы, чтобы редактировать их, не теряя реальных данных. В каждом файле найдите строку, которая должна совпадать, но не совпадает. Удалите все остальные строки. Запустите код, чтобы убедиться, что строка скопирована в выходной файл. Тогда у вас будет что-то простое для сравнения.
Я обнаружил, что Python неправильно читает эти странные символы: បោះដបំនឹងលក់រាយកមáŸ'មង០‹áž–ីរោងចកáŸ'ážšáž•áŸ'áž'ាស‹ðŸ“¥áž›áŸážážœáŸážšáž в четвертом столбце. Коды работают так, как и ожидалось, если их удалить и оставить только английские или цифровые символы. Я думаю, что лучший способ решить эту проблему — сравнить только два столбца (второй и третий), которые уникальны для каждой строки. Я разместил эту проблему в другом посте, но было сказано, что она дублируется. Я разместил это снова здесь, внизу моего исходного сообщения. Спасибо
используя модуль csv, вы можете читать и записывать в файл
import csv
fields = ['username', 'user id', 'access hash', 'name', 'group', 'group id'] # headers of the nodups.csv file
formate_data = lambda rows_list: [row.replace('\n', '').strip() for row in rows_list] # formatting any spaces
reader1 = [formate_data(row) for row in csv.reader(open("file1.csv", 'r', encoding = "utf8"))] # getting the data from the first file
reader2 = [formate_data(row) for row in csv.reader(open("file2.csv", 'r', encoding = "utf8"))] # getting the data from the second file
with open("nodups.csv", 'a', encoding = "utf8", newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(fields) # writing headers
for row in reader2: # looping the file2.csv
if row not in reader1: # checking if row for file2.csv is not inside file1.csv
writer.writerow(row)
это позволит убедиться, что нет пробелов, которые будут мешать процессу сравнения.
formate_data = lambda rows_list: [row.replace('\n', '').strip() for row in rows_list] # formatting any spaces
не работает - генерирует тот же результат, что и три версии кодов выше, и даже с двумя строками заголовков.
как написать две строки заголовков, хотя код явно может написать только одну? вы уверены, что запускаете правильный скрипт Python? вы пытались запустить его в чистой среде?
в первой версии нет заголовков, потому что, возможно, я использую Split() для получения только данных во втором столбце без заголовков. Вот почему мне нужно добавить заголовки в выходной файл, прежде чем писать строки под ними (вторая версия). Спасибо
Благодарим вас за вклад в сообщество Stack Overflow. Возможно, это правильный ответ, но было бы очень полезно предоставить дополнительные пояснения к вашему коду, чтобы разработчики могли понять ваши рассуждения. Это особенно полезно для новых разработчиков, которые не так хорошо знакомы с синтаксисом или пытаются понять концепции. Не могли бы вы отредактировать свой ответ, включив в него дополнительную информацию на благо сообщества?
Я добавил некоторые комментарии в свои ответы, и, надеюсь, они понятны всем. Спасибо
РЕШЕНО: Сравните два файла CSV на основе второго столбца (идентификатора пользователя) и распечатайте различия, обнаруженные во втором файле, и третьем файле:
with open('file1.csv', 'r', encoding = "utf8") as check_file:
check_set = set([row.split(',')[1] for row in check_file])
with open('file2.csv', 'r', encoding = "utf8") as filetwo, open('file3.csv', 'w', encoding = "utf8") as out_file:
for line in filetwo:
if line.split(',')[1] not in check_set:
out_file.write(line)
Или используйте следующее с заголовками:
with open('file1.csv', 'r', encoding = "utf8") as f1:
fileone = set([row.split(',')[1] for row in f1]) # Retrieve data in 2nd column for all rows in first CSV file
with open('file2.csv', 'r', encoding = "utf8") as filetwo, open('nodups.csv', 'w', encoding = "utf8") as out_file:
out_file.write('username,user id,access hash,name,group,group id' + '\n')
for line in filetwo: # Scan each line in second CSV file
if line.split(',')[1] not in fileone: # If the data of that line is not found in first file, write it into third file
out_file.write(line)
Не могу воспроизвести;
file2-nodups.csvгенерируется с ожидаемыми двумя строками. Проверьте, нет ли в каком-либо файле тонких различий, например, пробелов в конце. Кроме того, это просто наивное сравнение строк: тот факт, что файлы находятся в формате CSV, не имеет значения, поскольку CSV никогда не анализируется и не генерируется. Также, строго говоря, CSV не допускает дополнительных пробелов; пространство рядом с запятой будет считаться содержимым поля, поэтому вы получите значения типа" 87340a"вместо"87340a", которые вы предположительно ожидаете.