Чтение и сохранение значений из файла в Python [дубликат]

У меня есть предложение по указанной выше проблеме. Нет необходимости в дополнительном списке или дополнительном времени. Пожалуйста, найдите пример, который будет делать одни и те же вещи, но по-другому.

//"list" is ArrayList<Object>
//"state" is some boolean variable, which when set to true, Object will be removed from the list
int index = 0;
while(index < list.size()) {
    Object r = list.get(index);
    if( state ) {
        list.remove(index);
        index = 0;
        continue;
    }
    index += 1;
}

Это позволит избежать исключения параллелизма.

43
задан om-nom-nom 16 March 2013 в 16:34
поделиться

4 ответа

Предполагая, что у вас нет посторонних пробелов:

with open('file') as f:
    w, h = [int(x) for x in next(f).split()] # read first line
    array = []
    for line in f: # read rest of lines
        array.append([int(x) for x in line.split()])

Вы могли бы сконфигурировать последний цикл for во вложенном понимании списка:

with open('file') as f:
    w, h = [int(x) for x in next(f).split()]
    array = [[int(x) for x in line.split()] for line in f]
68
ответ дан zeekay 19 August 2018 в 04:13
поделиться
  • 1
    не являются значениями, хранящимися как строки? – ascobol 5 July 2011 в 14:53
  • 2
    Да, я полагаю, я должен обновить свой ответ. – zeekay 5 July 2011 в 14:57
  • 3
    Я думаю, что это подходящее решение, но я всегда не решаюсь перебирать и добавлять ... ИМО обычно более кратким и легче читать для работы с генераторами списков, где вы можете делать как в одной операции, так и без потока, как структура for. – machine yearning 5 July 2011 в 15:29
  • 4
    +1: Это отличный ответ, и ваше умелое использование как readline, так и line in f заслуживает самых высоких оценок. Приветствия. – machine yearning 6 July 2011 в 03:51
  • 5
    @ Jean-ClaudeArbaut Нет, вы правы. В Python 3 вам разрешено свободно смешивать next(f) и f.readline(), так как next() выполняется с помощью readline(), а буферизация перемещается в отдельный класс, используемый всеми механизмами чтения из файла. Спасибо за указание на это. Теперь я помню, как читал об этом много лет назад, но это сошло с ума, когда я написал предыдущий комментарий. – Sven Marnach 3 August 2016 в 13:53

работает с python2 (например, Python 2.7.10) и python3 (например, Python 3.6.4)

with open('in.txt') as f:
  rows,cols=np.fromfile(f, dtype=int, count=2, sep=" ")
  data = np.fromfile(f, dtype=int, count=cols*rows, sep=" ").reshape((rows,cols))

другим способом: работает как с python2 (например, Python 2.7.10), так и с python3 (например, Python 3.6.4), а также для сложных матриц см. пример ниже (только изменение int - complex)

with open('in.txt') as f:
   data = []
   cols,rows=list(map(int, f.readline().split()))
   for i in range(0, rows):
      data.append(list(map(int, f.readline().split()[:cols])))
print (data)

Я обновил код, этот метод работает для любого число матриц и любых матриц (int, complex, float) в исходном файле in.txt.

Эта программа дает матричное умножение в качестве приложения. Работает с python2, чтобы работать с python3 внести следующие изменения

print to print()

и

print "%7g" %a[i,j],    to     print ("%7g" %a[i,j],end="")

сценарий:

import numpy as np

def printMatrix(a):
   print ("Matrix["+("%d" %a.shape[0])+"]["+("%d" %a.shape[1])+"]")
   rows = a.shape[0]
   cols = a.shape[1]
   for i in range(0,rows):
      for j in range(0,cols):
         print "%7g" %a[i,j],
      print
   print      

def readMatrixFile(FileName):
   rows,cols=np.fromfile(FileName, dtype=int, count=2, sep=" ")
   a = np.fromfile(FileName, dtype=float, count=rows*cols, sep=" ").reshape((rows,cols))
   return a

def readMatrixFileComplex(FileName):
   data = []
   rows,cols=list(map(int, FileName.readline().split()))
   for i in range(0, rows):
      data.append(list(map(complex, FileName.readline().split()[:cols])))
   a = np.array(data)
   return a

f = open('in.txt')
a=readMatrixFile(f)
printMatrix(a)
b=readMatrixFile(f)
printMatrix(b)
a1=readMatrixFile(f)
printMatrix(a1)
b1=readMatrixFile(f)
printMatrix(b1)
f.close()

print ("matrix multiplication")
c = np.dot(a,b)
printMatrix(c)
c1 = np.dot(a1,b1)
printMatrix(c1)

with open('complex_in.txt') as fid:
  a2=readMatrixFileComplex(fid)
  print(a2)
  b2=readMatrixFileComplex(fid)
  print(b2)

print ("complex matrix multiplication")
c2 = np.dot(a2,b2)
print(c2)
print ("real part of complex matrix")
printMatrix(c2.real)
print ("imaginary part of complex matrix")
printMatrix(c2.imag)

as входной файл Я принимаю in.txt:

4 4
1 1 1 1
2 4 8 16
3 9 27 81
4 16 64 256
4 3
4.02 -3.0 4.0
-13.0 19.0 -7.0
3.0 -2.0 7.0
-1.0 1.0 -1.0
3 4
1 2 -2 0
-3 4 7 2
6 0 3 1
4 2
-1 3
0 9
1 -11
4 -5

и complex_in.txt

3 4
1+1j 2+2j -2-2j 0+0j
-3-3j 4+4j 7+7j 2+2j
6+6j 0+0j 3+3j 1+1j
4 2
-1-1j 3+3j
0+0j 9+9j
1+1j -11-11j
4+4j -5-5j

, а вывод выглядит так:

Matrix[4][4]
     1      1      1      1
     2      4      8     16
     3      9     27     81
     4     16     64    256

Matrix[4][3]
  4.02     -3      4
   -13     19     -7
     3     -2      7
    -1      1     -1

Matrix[3][4]
     1      2     -2      0
    -3      4      7      2
     6      0      3      1

Matrix[4][2]
    -1      3
     0      9
     1    -11
     4     -5

matrix multiplication
Matrix[4][3]
  -6.98      15       3
 -35.96      70      20
-104.94     189      57
-255.92     420      96

Matrix[3][2]
    -3     43
    18    -60
     1    -20

[[ 1.+1.j  2.+2.j -2.-2.j  0.+0.j]
 [-3.-3.j  4.+4.j  7.+7.j  2.+2.j]
 [ 6.+6.j  0.+0.j  3.+3.j  1.+1.j]]
[[ -1. -1.j   3. +3.j]
 [  0. +0.j   9. +9.j]
 [  1. +1.j -11.-11.j]
 [  4. +4.j  -5. -5.j]]
complex matrix multiplication
[[ 0.  -6.j  0. +86.j]
 [ 0. +36.j  0.-120.j]
 [ 0.  +2.j  0. -40.j]]
real part of complex matrix
Matrix[3][2]
      0       0
      0       0
      0       0

imaginary part of complex matrix
Matrix[3][2]
     -6      86
     36    -120
      2     -40
-2
ответ дан Andrei 19 August 2018 в 04:13
поделиться

Не знаете, зачем вам нужен w, h. Если эти значения действительно необходимы и означают, что нужно читать только указанное количество строк и столбцов, вы можете попробовать следующее:

output = []
with open(r'c:\file.txt', 'r') as f:
    w, h  = map(int, f.readline().split())
    tmp = []
    for i, line in enumerate(f):
        if i == h:
            break
        tmp.append(map(int, line.split()[:w]))
    output.append(tmp)
3
ответ дан Artsiom Rudzenka 19 August 2018 в 04:13
поделиться
  • 1
    Интересный подход, чтобы включить данные заголовка, я даже не думал об этом. +1 для полноты ... но это немного длинный / трудно читать :) – machine yearning 5 July 2011 в 15:22
  • 2
    Thanx) Я создал расширенное решение, которое выполняет итерацию по строкам и создает список списка для всех вхождений w, h. Однако лучший ответ уже выбран))) – Artsiom Rudzenka 5 July 2011 в 15:47

Для меня такая, казалось бы, простая проблема - вот что такое Python. Особенно, если вы исходите из такого языка, как C ++, где простой анализ текста может быть болью в прикладе, вы по достоинству оцените функционально единое решение, которое может дать вам python.

Вам понадобятся open(name, mode), myfile.readlines(), mystring.split(), int(myval), а затем вы Вероятно, вы захотите использовать пару генераторов, чтобы собрать их все вместе с помощью pythonic.

# This opens a handle to your file, in 'r' read mode
file_handle = open('mynumbers.txt', 'r')
# Read in all the lines of your file into a list of lines
lines_list = file_handle.readlines()
# Extract dimensions from first line. Cast values to integers from strings.
cols, rows = (int(val) for val in lines_list[0].split())
# Do a double-nested list comprehension to get the rest of the data into your matrix
my_data = [[int(val) for val in line.split()] for line in lines_list[1:]]

Найти выражения генератора здесь . Они могут действительно упростить ваш код в отдельные функциональные блоки! Представьте, что вы делаете то же самое в 4-х строках на C ++ ... Это был бы монстр. В частности, генераторы списков, когда я был парнем C ++, я всегда хотел, чтобы у меня было что-то подобное, и я часто приводил к созданию пользовательских функций для создания каждого типа массива, который я хотел.

12
ответ дан machine yearning 19 August 2018 в 04:13
поделиться
  • 1
    Я не думаю, что это работает. cols, rows = (int(val) for val in '4 3\n') не делает то, что вы хотите. То же самое для [int(val) for val in line], потому что line будет что-то вроде '1 2 3 4\n' – Jason R. Coombs 5 July 2011 в 14:57
  • 2
    @ Джейсон: Да, жаль, что в моем исходном коде было несколько ошибок, но суть была прав. Исправлено выше. Наверное, это итеративное развитие! :) – machine yearning 5 July 2011 в 14:59
  • 3
    В тривиальном случае OP упоминает, что версия C ++, хотя и немного длиннее, не была бы "монстром" как ты говоришь. Вы использовали бы fscanf () или потоки, а vector & lt; vector & lt; int & gt; gt; (или даже int [] []). И C ++ обеспечит гораздо больший контроль над управлением памятью при чтении и анализе файла. – dolphin 18 June 2014 в 23:50
  • 4
    На самом деле, ifstreams проще обрабатывать, чем fscanf, что является функцией C, а не C ++. Если вы просто разбираете текст на C ++ и имеете что-то более сложное, чем предлагаемое решение python, вы явно делаете что-то неправильно. – Andrej 10 July 2015 в 01:43
Другие вопросы по тегам:

Похожие вопросы: