Я пытаюсь импортировать список химических веществ из текстового файла, который разделен (без вкладок).
NO FORMULA NAME CAS No A B C D TMIN TMAX code ngas@TMIN ngas@25 C ngas@TMAX
1 CBrClF2 bromochlorodifluoromethane 353-59-3 -0.0799 4.9660E-01 -6.3021E-05 -9.0961E-09 200 1500 2 96.65 142.14 572.33
2 CBrCl2F bromodichlorofluoromethane 353-58-2 4.0684 4.1343E-01 1.6576E-05 -3.4388E-08 200 1500 2 87.14 127.90 545.46
3 CBrCl3 bromotrichloromethane 75-62-7 7.3767 3.5056E-01 6.9163E-05 -4.9571E-08 200 1500 2 79.86 116.73 521.53
4 CBrF3 bromotrifluoromethane 75-63-8 -9.5253 6.5020E-01 -3.4459E-04 1.0987E-07 230 1500 1,2 123.13 156.61 561.26
5 CBr2F2 dibromodifluoromethane 75-61-6 2.8167 4.9405E-01 -1.2627E-05 -2.8629E-08 200 1500 2 100.89 148.24 618.87
6 CBr4 carbon tetrabromide 558-13-4 10.6812 3.2869E-01 1.0739E-04 -6.0788E-08 200 1500 2 80.23 116.62 540.18
7 CClF3 chlorotrifluoromethane 75-72-9 13.8075 4.7487E-01 -1.3368E-04 2.2485E-08 230 1500 1,2 116.23 144.10 501.22
8 CClN cyanogen chloride 506-77-4 0.8665 3.6619E-01 -2.9975E-05 -1.3191E-08 200 1500 2 72.80 107.03 438.19
Когда я импортирую с пандами
df = pd.read_csv('trial1.txt', sep='\s')
Я получил:
Для первых 5 соединений (индекс 0-4) название указано правильно в колонке Name, а для 6-го (индекс 5) и 8-го (индекс 7) соединений - их название разделено пробелом и идет к CAS. В результате значение столбца CAS помещается под столбец No и значения и так далее.
Есть ли способ устранить эту проблему? Спасибо
Регулярные выражения могут вам помочь.
Я бы посоветовал вам немного поработать над файлом «trial1.txt», прежде чем загружать его в df. Следующий код приведет к тому, что вы, наконец, хотите получить:
with open ('trial1.txt') as f:
l=f.readlines()
l=[i.split() for i in l]
target=len(l[1])
for i in range(1,len(l)):
if len(l[i])>target:
l[i][2]=l[i][2]+' '+l[i][3]
l[i].pop(3)
l=['#'.join(k) for k in l] #supposing that there is no '#' in your entire file, otherwise use some other rare symbol that doesn't eist in your file
l=[i+'\n' for i in l]
with open ('trial2.txt', 'w') as f:
f.writelines(l)
df = pd.read_csv('trial2.txt', sep='#', index_col=0)
Спасибо за ответ. Когда я запускаю ваш код TypeError: writelines() takes exactly one argument (0 given). Так что не знаю, как там поступить. Не могли бы вы помочь там?
С обновленным кодом я все еще не получаю желаемого результата. Что происходит, вместо того, чтобы получать составные в виде отдельной строки, я получаю эти значения между # как новые имена столбцов
Не могли бы вы вставить образец df, созданного с помощью моего решения?
Ниже результат df.columns --> Index(['NO', 'FORMULA', 'NAME', 'CAS', 'No', 'A', 'B', 'C', 'D', 'TMIN ', ... '0.8665', '3.6619E-01', '-2.9975E-05', '-1.3191E-08', '200.5', '1500.7', '2.5', '72.80', '107.03 ', '438.19'], значения становятся именами столбцов.
Каков результат len(l)? Это 1?
Нет, len(l) равно 9. Я думаю, что нужно что-то изменить в with open ('trial2.txt', 'w') as f: f.writelines(l), но не знаю что. Спасибо
Я внес некоторые изменения в код, попробуйте еще раз. Проблема была в том, что должно быть l=[['#'.join(k)] for k in l] вместо l=['#'.join(k) for k in l]
@ IoaTzimas: Спасибо за помощь. Теперь проблема с with open ('trial2.txt', 'w') as f: f.writelines(l). Trial2.txt пуст. Ошибка: TypeError: write() argument must be str, not list
Привет @pukumarathe, я обновил свой ответ, пожалуйста, проверьте еще раз, теперь он должен работать правильно
Спасибо .. Теперь это действительно работает для этого набора данных. Однако, если я применю тот же код для примера набора данных другого вопроса (который отличается от этого), я получу ParserError: Error tokenizing data. C error: Expected 16 fields in line 43, saw 17. Вопрос: https://stackoverflow.com/questions/65456221/variable-number-of-unwanted-white-spaces-resulting-into-distorted-column
Просто поиграйте с целью и с кодом на случай, если некоторые ячейки разбиты более чем на 2 части. Смотрите мое объяснение в вашем новом вопросе. Давайте обсудим это там (stackoverflow.com/questions/65456221/…)
Попробуй это:
В основном вам нужно убрать пробелы между словами в столбце имени. Итак, здесь я сначала прочитал файл, а затем удалил пробелы в столбце NAME, используя re.sub.
В этом коде я предполагаю, что слова разделены по крайней мере 5 буквами с обеих сторон. Вы можете изменить это число {5} по своему усмотрению.
import re
with open('trial1.txt', 'r') as f:
lines = f.readlines()
l = [re.sub(r"([a-z]{5,})\s([a-z]{5,})", r"\1\2", line) for line in lines]
df = pd.read_csv(io.StringIO('\n'.join(l)), delim_whitespace=True)
Отпечатки:
NO FORMULA NAME CAS No A B C D TMIN TMAX code ngas@TMIN ngas@25 C.1 ngas@TMAX
1 CBrClF2 bromochlorodifluoromethane 353-59-3 -0.0799 0.49660 -0.000063 -9.096100e-09 200 1500 2 96.65 142.14 572.33 NaN NaN
2 CBrCl2F bromodichlorofluoromethane 353-58-2 4.0684 0.41343 0.000017 -3.438800e-08 200 1500 2 87.14 127.90 545.46 NaN NaN
3 CBrCl3 bromotrichloromethane 75-62-7 7.3767 0.35056 0.000069 -4.957100e-08 200 1500 2 79.86 116.73 521.53 NaN NaN
4 CBrF3 bromotrifluoromethane 75-63-8 -9.5253 0.65020 -0.000345 1.098700e-07 230 1500 1,2 123.13 156.61 561.26 NaN NaN
5 CBr2F2 dibromodifluoromethane 75-61-6 2.8167 0.49405 -0.000013 -2.862900e-08 200 1500 2 100.89 148.24 618.87 NaN NaN
6 CBr4 carbontetrabromide 558-13-4 10.6812 0.32869 0.000107 -6.078800e-08 200 1500 2 80.23 116.62 540.18 NaN NaN
7 CClF3 chlorotrifluoromethane 75-72-9 13.8075 0.47487 -0.000134 2.248500e-08 230 1500 1,2 116.23 144.10 501.22 NaN NaN
8 CClN cyanogenchloride 506-77-4 0.8665 0.36619 -0.000030 -1.319100e-08 200 1500 2 72.80 107.03 438.19 NaN NaN
Привет @sharathnatraj, большое спасибо за ответ. В моем спайдере df = pd.read_csv(io.StringIO('\n'.join(l)), delim_whitespace=True) не работает. Ошибка следующая: NameError: name 'io' is not defined. Что мне не хватает?
Можешь попробовать import io
Большое спасибо .. работает именно так, как я хотел. :D
Можете ли вы опубликовать текстовый файл как текст вместо изображения, пожалуйста..