2013-02-27 2 views
0

У меня есть текстовый файл с этим форматом:Удаление определенного текста из каждой строки

something text1 pm,bla1,bla1 
something text2 pm,bla2,bla2 
something text3 am,bla3,bla3 
something text4 pm,bla4,bla4 

и в новом файле я хочу провести:

bla1,bla1 
bla2,bla2 
bla3,bla3 
bla4,bla4 

У меня есть это, который удерживает первые 10 символы, например, каждой строки. Могу ли я преобразовать эту или любую другую идею?

with open('example1.txt', 'r') as input_handle: 
    with open('example2.txt', 'w') as output_handle: 
     for line in input_handle: 
      output_handle.write(line[:10] + '\n') 
+1

В этой ситуации вы могли бы просто '.split (", ") [1]' – GordonsBeard

+0

Или с одной строкой в ​​awk. 'awk -F, '{print $ 2}'' – squiguy

+0

'perl -ne 'print" $ 1 \ n "if /.*,(.*)/' input> output' – 6502

ответ

1

Чтобы удалить первый "" - отделенный столбец из файла :

first, sep, rest = line.partition(",") 
if rest: # don't write lines with less than 2 columns 
    output_handle.write(rest) 
+0

безупречный спасибо! –

3

Это то, что было сделано для модуля csv.

import csv 
reader = csv.reader(open('file.csv')) 

for row in reader: print(row[1]) 

Вы можете просто перенаправить вывод файла в новый файл, используя вашу оболочку, или вы можете сделать что-то подобное, вместо последней строки:

for row in reader: 
    with open('out.csv','w+') as f: 
     f.write(row[1]+'\n') 
+0

Почему бы не использовать модуль 'csv' для вывода? – abarnert

0

Try:

output_handle.write(line.split(",", 1)[1]) 

От the docs:

str.split([Сентябре[,maxsplit]])

Возвращает список слов в строке, используя SEP в качестве строки разделителей. Если дано maxsplit, самое большее maxsplit расколы выполнены (таким образом, список будет содержать не более maxsplit+1 элементов).

1

Если формат фиксируется:

with open('example1.txt', 'r') as input_handle: 
    with open('example2.txt', 'w') as output_handle: 
     for line in input_handle: 
      if line: # and maybe some other format check 
       od = line.split(',', 1) 
       output_handle.write(od[1] + "\n") 
+0

Это не включает запятые из его предполагаемого выхода.Вы можете добавить их обратно, но почему бы не просто 'line.split (',', 1)' и 'write (od [1])'? Или используйте 'partition'? – abarnert

+0

@abarnert Хороший вызов на 'line.split (',', 1)' !!! Отредактировано, спасибо :) – woozyking

1

Вот как я бы написать.

Python 2,7

import csv 
with open('example1.txt', 'rb') as f_in, open('example2.txt', 'wb') as f_out: 
    writer = csv.writer(f_out) 
    for row in csv.reader(f_in): 
     writer.write(row[-2:]) # keeps the last two columns 

Python 3.x (обратите внимание на различия в качестве аргументов open)

import csv 
with open('example1.txt', 'r', newline='') as f_in: 
    with open('example2.txt', 'w', newline='') as f_out: 
     writer = csv.writer(f_out) 
     for row in csv.reader(f_in): 
      writer.write(row[-2:]) # keeps the last two columns 
+0

+1 для использования 'csv' для ввода и вывода. (Кстати, зачем явным образом указывать 2.7? Есть ли что-нибудь здесь, я не хватает, что делает ваш код не работать с 2.6, 3.x и т. Д.?) – abarnert

+0

@abarnert: первая версия ставит два менеджера контекста на одну строку, который был введен в 2.7. Мне кажется, что отвратительно иметь отступы на два уровня только для безопасного ввода файлов. Однако я изменил его на две строки в версии 3.x из-за длины строки. –

+0

@abarnert: Кроме того, в Python 2.x модуль csv ожидает, что файл будет открыт в двоичном режиме. В Python 3.x модуль csv нуждается в нем в текстовом режиме и нуждается в 'newline = '''. –

Смежные вопросы