2015-04-23 3 views
0

Так что это сводит меня с ума. Мне нужно взять текстовый файл, содержащий (все в одной строке)Python: проблема редактирования строки в текстовом файле

mmfff м фм Fmm FFF мммМММ mfmfmf mmmfff ММ fmmmf

и манипулировать ею в программе. Он должен открыть и прочитать файл, отредактировать пробелы и изменить все буквы на кепки. Затем нужно распечатать отредактированный файл, подсчитать m и f и вывести их как процент от целого.

# A program to determine male to female ratio 

import math 

main = raw_input("Enter the name of your file: ") 

inputFile = open(main, 'r+') 

gender =(inputFile.read().replace(" ", "").replace("f", "F").replace("m", "M")) 

inputFile.close() 

inputFile= open(main, 'r+') 

inputFile.write(gender) 

inputFile.close() 

print gender 

fletter = 0 

mletter = 0 

mletter = gender.count('M') 

fletter = gender.count('F') 

mletter =((mletter*100)/39)*1.0 

fletter =((fletter*100)/39)*1.0 

print "There are", mletter, " males and", fletter, " females." 

Я пробовал так много способов, я даже не могу их запомнить! Мои проблемы в том, что он не редактирует файл txt должным образом, у меня есть лишние буквы в конце строки. И он отказывается обойти мою математику в конце, поэтому я заканчиваю 58 и 41, когда ей должно быть 59. И да, я действительно пробовал круглую функцию, не помог.

+1

Попробуйте 'my_string.upper()' вместо 'my_string.replace ('m', 'M'). Replace ('f', 'F')'. – TigerhawkT3

+0

Итак, у меня было это так, но я изменил его, думая, что с ним что-то не так, когда выход был неправильным. – Hatricia

ответ

1

У вас есть несколько вопросов здесь:

  1. Вы делаете целочисленное деление, то преобразование в поплавки. Исправить эту попытку: mletter =((mletter*100)/39.0).
  2. Используя режим r+, чтобы перезаписать файл, вы не сначала удаляете старый контент. Это означает, что при первом запуске приложения он удалит пробелы и перезапишет только начало новым содержимым и оставит последние несколько букв без изменений. Вместо этого попробуйте режим w.
  3. Нет необходимости в настройке нужного файла 0: fletter = 0 В любом случае вы просто переписываете его на следующей строке.
  4. Вы не используете модуль math, не нужно его импортировать.

(результат 58,97435897435898, кстати, не 59)

+0

Хорошо, я не был уверен, что будет делать w, b/c, когда я проверю свой текстовый файл, он был пуст в конце, когда он должен был быть написан, но это имеет смысл. И я использовал математический модуль, когда я пытался использовать круглую функцию, просто забыл ее вернуть. Спасибо – Hatricia

+0

Кроме того, мне нужно, чтобы это было 59, что является частью проблемы, оба числа должны быть процентом целого (а 58 и 41 - всего 99), но по какой-то причине с десятичной точкой .0, поэтому мне нужно его округлить до 59.0 – Hatricia

+0

Как только вы получите правильный результат, вы можете использовать раунд. Все еще не нужно для модуля 'math' -' round() 'является глобальным. Просто распечатайте 'int (round (mletter))' (после других исправлений) – viraptor

0

Я сделал некоторые улучшения в коде ниже. Встроенные комментарии объясняют, что делает каждая часть, и какие улучшения она делает с вашей первоначальной попыткой.

main = raw_input("Enter the name of your file: ") 

# make this a function since we use the equation more than once 
def get_percent(part, whole): 
    return 100 * float(part)/float(whole) 

# make sure we handle the file not existing 
try: 
    with open(main, 'r+') as fd: 
     # replace 
     newstr = fd.read().replace(' ', '').upper() 
     # after reading the file the file pointer will be at the end, we need to seek 
     # back to the start of the file 
     fd.seek(0) 
     # remove the existing file contents 
     fd.truncate() 
     fd.write(newstr) 
except IOError: 
    # provide a friendly error and exit instead of a stacktrace 
    raise SystemExit("Failed to open file %s" % main) 


mletter = newstr.count('M') 
fletter = newstr.count('F') 
total = len(newstr) 

# Using string formatting is often easier to read than string concatentation 
print "There are %s%% males and %s%% females" %(
               get_percent(mletter, total), 
               get_percent(fletter, total) 
               ) 
+0

Я ценю комментарии в коде! Спасибо, я пойду посмотреть, что я могу сделать с моим кодом. – Hatricia

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