Помогите удалить элементы из текстового файла с помощью Python - PullRequest
0 голосов
/ 02 августа 2010

После реализации некоторых решений из моего предыдущего вопроса я нашел следующее решение:

reader = open('C://text.txt') 
writer = open('C://nona.txt', 'w')
counter = 1    
names, nums = [], []    
row = reader.read().split(' ')
x = len(row)/2
for (a, b) in [(c, d) for c, d in zip(row[:x], row[x:]) if d!='na']:
    print counter
    counter +=1
    names.append(a)
    nums.append(b)

writer.write(' '.join(names))
writer.write(' ')
writer.write(' '.join(nums))

Эта программа работает довольно хорошо для небольшого набора данных. Однако он зависает, когда я использую полный набор данных, и вызывает сбой Python. Любые предложения о том, как я могу преодолеть это?

Ответы [ 2 ]

1 голос
/ 02 августа 2010

Что вам нужно сделать, это разбить ваш файл на два отдельных файла. Ваша логика должна сделать что-то вроде этого:

  1. Открыть файл данных
  2. открыть имя файла
  3. читать следующие данные
  4. это имя? см. 5. В противном случае см. 6
  5. записать имя в имя файла, см. 3
  6. это число или нет? закрыть имя файла и открыть файл номера
  7. читать следующие данные
  8. это число или нет? см. 7, в противном случае напишите файл

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

names = open('names.txt')
numbers = open('numbers.txt')

for name, number in zip(names, numbers):
   if not numbers == 'na':
       output.write(name + " " + number)

или вы можете записать в два разных файла, а затем соединить их вместе, если это то, что вам нужно.

0 голосов
/ 02 августа 2010

Ваш файл организован неудачным образом для обработки Pythonic.

Обратите внимание, что когда вы вызываете reader.read(), вы читаете весь файл в память.Допустим, это занимает X байтов.

Вызов split эффективно добавит еще X байтов использования памяти, так как создаст новую строку для каждой отдельной строки в файле.

Затем вы вызываете row[:x] и row[x:], что добавит ДРУГИЕ байты X (потому что оператор среза делает копию).

Затем вы вызываете zip и создаете понимание списка,и т. д. и т. д. Строки и кортежи являются неизменяемыми данными, что означает, что вы всегда создаете их с нуля.

Я бы подошел к этой проблеме на более низком уровне.Откройте один дескриптор файла и укажите его начало файла.Откройте другое и попросите его найти начало (na / 0/1/2) значений (вы узнаете, где это, подсчитав пробелы).Теперь читайте одно имя и одно значение за раз, и если значение не «na», вы можете записать имя в выходной файл.Если вам необходимо также записать значения в выходной файл, сохраните их в памяти и запишите все сразу, как только вы закончите.

К сожалению, это будет сложнее, чем просто использование высокоуровневых функцийкоторый предоставляет Python (вам нужно будет написать код, который работает на уровне символов), но, как вы видели, за эти функции высокого уровня приходится платить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...